ASP .Net Core内置 Identity 简介 使用

2023-05-16

一、简介

1、概况

        ASP.NET Core Identity是一个成员身份系统,可将用户注册和登录功能添加到 ASP.NET Core Web UI。 成员身份系统处理身份验证和授权问题。 身份验证涉及你的身份。 授权涉及允许你进行的操作。 因此,身份验证是授权的先决条件。 ASP .Net Core Identity内置了一组认证功能,用于简单的Web应用的认证和授权。

 ASP.NET Core Identity:

  • 一个 API,它支持用户界面 (UI) 登录功能。
  • 管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等等。

        Identity ASP.NET Core与Microsoft 标识平台无关。 ASP.NET Core Identity 将用户界面 (UI) 登录功能添加到 ASP.NET Core Web 应用。 若要保护 Web API 和 SPA,请使用以下项之一:

  • Azure Active Directory
  • Azure Active Directory B2C (Azure AD B2C)
  • Identity Server4

IdentityServer4 是适用于 ASP.NET Core 的 OpenID Connect 和 OAuth 2.0 框架。 IdentityServer4 支持以下安全功能:

  • 身份验证即服务 (AaaS)
  • 跨多个应用程序类型的单一登录/注销 (SSO)
  • API 的访问控制
  • Federation Gateway

2、结构

        Identity 通常使用 SQL Server 数据库进行配置,以存储用户名、密码和配置文件数据。 或者,可使用其他持久性存储,例如 Azure 表存储。Identity的层次结构如下:

在上图中:

  • ASP.NET Core Razor Pages 应用表示将在本模块中向其添加标识支持的 Web UI。
  • Identity Manager 层包含 Microsoft.AspNetCore.Identity 命名空间中使用的类。 本模块中显式使用的此类的示例是 SignInManager<TUser> 和 UserManager<TUser>
  • EF Core 标识存储区层包含 Microsoft.AspNetCore.Identity.EntityFrameworkCore 命名空间中的类。 本模块中隐式使用的此类的示例是 UserStore<TUser>
  • 数据库提供程序是一种特定于数据库的库,它接受来自 EF Core 提供程序(未示出)的 SQL 并执行它。

EF Core 使用一项称为迁移的功能来增量更新数据库架构,使其与应用的数据模型保持同步。 应用初始 EF Core 迁移后,将创建支持的数据库表。 下图描述了支持Indentity的表的架构:

3、Identity实体模型和实体间关系

Identity 模型

实体类型

Identity 模型包含以下实体类型。

实体类型说明
User表示用户。
Role表示一个角色。
UserClaim表示用户拥有的声明。
UserToken表示用户的身份验证令牌。
UserLogin将用户与登录名相关联。
RoleClaim表示向角色中所有用户授予的声明。
UserRole关联用户和角色的联接实体。

实体类型关系

实体类型通过以下方式相互相关:

  • 每个 User 可以有多个 UserClaims
  • 每个 User 可以有多个 UserLogins
  • 每个 User 可以有多个 UserTokens
  • 每个 Role 可以有多个关联的RoleClaims
  • 每个 User 可以有多个关联的 Roles,并且每个 Role 可以与多个 Users 关联。 这是一种多对多关系,需要数据库中的联接表。 联接表由 UserRole 实体表示。

二、试用

1、使用基架添加Indentity认证结构

安装基架工具

dotnet tool install dotnet-aspnet-codegenerator --version 6.0.2 --global

 向项目添加以下NuGet包

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 6.0.2
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 6.0.3
dotnet add package Microsoft.AspNetCore.Identity.UI --version 6.0.3
dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.3
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 6.0.3

 使用基架命令向项目添加默认标识组件。 在终端中运行以下命令:

dotnet aspnet-codegenerator identity --useDefaultUI --dbContext ProjectDbContext

 项目下,新增目录结构

Areas
 └─Identity
    ├─Data
    └─Pages
        └─Account
            └─Manage 

查看基架向项目添加的文件列表

$> dotnet aspnet-codegenerator identity --listFiles
Building project ...
Finding the generator 'identity'...
Running the generator 'identity'...
File List:
Account._StatusMessage
Account.AccessDenied
Account.ConfirmEmail
Account.ConfirmEmailChange
Account.ExternalLogin
Account.ForgotPassword
Account.ForgotPasswordConfirmation
Account.Lockout
Account.Login
Account.LoginWith2fa
Account.LoginWithRecoveryCode
Account.Logout
Account.Manage._Layout
Account.Manage._ManageNav
Account.Manage._StatusMessage
Account.Manage.ChangePassword
Account.Manage.DeletePersonalData
Account.Manage.Disable2fa
Account.Manage.DownloadPersonalData
Account.Manage.Email
Account.Manage.EnableAuthenticator
Account.Manage.ExternalLogins
Account.Manage.GenerateRecoveryCodes
Account.Manage.Index
Account.Manage.PersonalData
Account.Manage.ResetAuthenticator
Account.Manage.SetPassword
Account.Manage.ShowRecoveryCodes
Account.Manage.TwoFactorAuthentication
Account.Register
Account.RegisterConfirmation
Account.ResendEmailConfirmation
Account.ResetPassword
Account.ResetPasswordConfirmation
RunTime 00:00:08.09

文件夹和所包含的文件

  • Data/
    • RazorPagesPizzaUser.cs
  • Pages/
    • _ViewImports.cshtml
    • Account/
      • _ViewImports.cshtml
      • ConfirmEmail.cshtml
      • ConfirmEmail.cshtml.cs
      • Register.cshtml
      • Register.cshtml.cs
      • Manage/
        • _ManageNav.cshtml
        • _ViewImports.cshtml
        • EnableAuthenticator.cshtml
        • EnableAuthenticator.cshtml.cs
        • Index.cshtml
        • Index.cshtml.cs
        • ManageNavPages.cs

在配置完数据库上下文后,用EF Core更新数据库后,便可运行。

dotnet tool install dotnet-ef --version 6.0.3 --global


dotnet ef migrations add CreateIdentitySchema
dotnet ef database update

2、自定义认证

创建新用户类继承自IdentityUser(已在内部定义),并可添加自定义的属性和方法

public class RazorPagesPizzaUser : IdentityUser
{
    [Required]
    [MaxLength(100)]
    public string FirstName { get; set; } = string.Empty;

    [Required]
    [MaxLength(100)]
    public string LastName { get; set; } = string.Empty;

    public string BirthDay {get;set;} = string.Empty;
}

根据自定义用户属性更新数据库

dotnet ef migrations add UpdateUser
dotnet ef database update

查看数据结构已添加新属性

 

 再同步更新,Register、Index等相关页面中的控件、验证信息,便可以运行

3、启用认证

在需要验证的页面中添加【Authorise】便可以启用验证了

[Authorize]
public class PizzaModel : PageModel

 

 尝试注册 一个新用户

 Register后服务端自然生成确认URL,在有外网smtp服务器的情况下,可以自动发至注册邮箱。

Email Confirmation Message
--------------------------
TO: abcd@shanghai.com
SUBJECT: Confirm your email
CONTENTS: Please confirm your account by visiting the following URL:

https://localhost:7192/Identity/Account/ConfirmEmail?userId=fc053309-f4e3-455c-9ff4-08b1842a9fc1&code=Q2ZESjhGb3puQnVsQTBGSGxadFhSUmdBZWQrdG9Tb0pKcU1CeU8vZHdLYm9ycnRYaE1hdjJZeWxoM3BJSzJoVk84TEx4VkgxME9wN3RqWldPQ0gxN1BjVjF4dGxwdkhnOGJMZ0FlWW8rZXhTYjJlSjlvaERLTXQ2eGFQb29oSGdPbWVud2hLUXRrZSs5NXpoeGZwZHdDSm5QV1FYeDdIYUI3RTl1ME9yaURiQjc4Y0YvZWRIa0xUeU1YNFYwMmpvUU9kQUQ3L3VmRy9obGJtTkNWVE10SXU1dVBQd2g4V2Y3aHhHdHBqdG8vWXNpSGJ0MFVHbHgvNVI1WmxCYmtvNlhEUE1Kdz09&returnUrl=%2F

确认后登录,便可访问所认证页面

 

 登录后就可以访问List页面

 

完成了,用户认证、授权的最简过程。 

 

三、参考文章

1、简介 - Training | Microsoft Learn

2、ASP.NET Core 中的 Identity 模型自定义 | Microsoft Learn

3、ASP.NET Core 上的 Identity 简介 | Microsoft Learn

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP .Net Core内置 Identity 简介 使用 的相关文章

  • 如何获取 WPF 用户控件可见部分的大小?

    我有一个由标签和文本框组成的用户控件 它位于滚动查看器内 我正在其顶部绘制一个装饰器 并且需要将装饰器的大小调整为控件的可见大小 如何获得控件的可见大小 在下图中 绿色矩形是装饰器 正如您所看到的 它被绘制在右侧的滚动条上 是否可以获得渲染
  • 如何使用反射确定属性类型?

    如何测试类型的属性以查看它是否是指定类型 编辑 我的目标是检查程序集以查看该程序集中的任何类型是否包含 MyType 或从 MyType 继承 的属性 这是我走过的路 AssemblyName n new AssemblyName n Co
  • 强制 WcfSvcHost.exe 使用我的自定义服务主机

    是否可以强制 WcfSvcHost 当我执行 F5 或在解决方案中调试另一个项目时自动执行 使用自定义 ustom 服务 通过使用服务工厂 我的自定义服务主机在我的 asp net 主机容器中运行良好 该服务工厂又调用自定义服务库 但是当
  • 使用正则表达式或其他解析从文件中读取值

    我有一个记录带有时间戳的值的文件 我必须在特定时间后读取特定值 例如 文件有 2013 03 03 19 08 22 car 2001 Ford 2013 03 03 19 08 27 Truck 2012 Chevy 2013 03 03
  • Task.Delay 是否真的像 I/O 操作一样异步,即它依赖于硬件和中断而不是线程?

    我发现了大量相关内容 但这些内容都是拐弯抹角的 但我始终无法找到答案 我几乎 100 确定Task Delay int 不使用线程 因为我可以在只有 16 个逻辑处理器的机器上运行此代码 var tasks new List
  • 使用 Entity Framework Code Only 和 ASP.NET MVC 的模块化应用程序

    我所说的模块化应用程序是指无需修改核心应用程序代码即可扩展基本功能和数据模型的应用程序 这是一种流行的方法 例如 开源 CRM 例如 SugarCRM 或 VTiger 在使用区域或 来自 MVC contrib 的可移植区域 的 ASP
  • 以编程方式将 Word 文件另存为图片

    我想将Word文档的第一页另存为图片 使用 C 有什么方法可以做到这一点 您可以将 Word 文档打印到 XPS 文档 在 WPF Net 3 5 应用程序中打开它 并使用 WPF 框架的文档和图像功能将第一个内部固定页面对象转换为位图 如
  • 索引 getter 中的 IndexOutOfRangeException

    在我的索引属性中 我检查索引是否超出范围 如果是的话 我抛出一个IndexOutOfBoundsException 当我运行代码分析器 在 VS12 中 时 它抱怨 CA1065 意外位置出现意外异常 参考CA1065的描述 仅 Syste
  • SQL 注入在 winform 中有效吗?

    我正在用 C 制作一个 Windows 软件 我读过关于sql injection但我没有发现它适用于我的应用程序 SQL 注入在 winform 中有效吗 如果是的话如何预防 EDIT 我正在使用文本框来读取用户名和密码 通过使用 tex
  • 通过网络共享的 SQL CE

    我之前见过这个问题 但找不到关于什么是可能 不可能以及什么解决方法可能可用的明确解释 我有一个现有的 C 应用程序 它使用 SQL CE 来存储本地信息 该数据库只能由单个应用程序访问 并存储在用户的 appdata 文件夹中 某些环境将
  • 如何在C#中获取登录SID

    如何在 C net 中检索 Windows 登录 SID 不是用户 SID 而是每个会话的唯一新 SID 恐怕您必须求助于使用 P Invoke 有一个如何做到这一点的示例pinvoke net http www pinvoke net d
  • 是否可以在 app.config 键值中包含超链接?

    是否可以将超链接作为 app config 键值对中文本的一部分 电子邮件正文文本作为值 我想从 app config 键值生成电子邮件正文 例如
  • 微软编码标准文档

    Microsoft 是否有可供下载的编码标准文档 我想使用他们的标准 主要针对 C 如果您使用 C 则可以通过运行以下命令在编码时了解 Microsoft 的首选风格StyleCop http code msdn microsoft com
  • 按属性值选择 XML 节点

  • ADO.NET 实体框架的实际好处是什么?

    我正在读这篇关于ADO NET 实体框架 http msdn microsoft com en us library bb399572 aspx并发现它非常有趣 尽管在第一个镜头中我无法破译很多东西 我再次阅读这篇文章 以了解其背后的真正逻
  • VS2010 .NET 内存分析 - 非常慢

    运行 VS2010 的 NET 内存分配分析需要很长时间才能完成 该程序本身运行了大约 3 分钟并生成了 35GB 的内存分配 探查器的输出文件约为 28GB 报告分析流程接管三个小时 在具有 8GB RAM 的双 Xeon 上 即可完成
  • log4net 未记录到数据库

    我有一个奇怪的问题 我的 log4net 设置没有将任何数据记录到数据库中 也没有引发任何异常来通知问题 我已经在一个名为 Log4net Config 的单独文件中定义了配置设置 并且 已经在程序集中引用了它 请注意 我通过 nuget
  • 当用户与 DateTimePicker 控件交互时会引发什么事件?

    我是 C 新手 在我的程序中使用 DateTimePicker Value Changed 事件 但我发现当用户单击箭头时发生 ValueChanged 事件 或者如果也以编程方式更改值 我只想识别 DateTimePicker 的用户交互
  • FileStream - “不支持给定路径的格式”

    我正在尝试使用EPPlus http epplus codeplex com 在我们的 LAN 上保存电子表格 我正在使用一个FileStream对象执行此操作 但是每当我尝试实例化该对象时 我都会收到错误 The given path s
  • 隐藏错误报告窗口

    我有以下问题 我的 ASP Net 应用程序接收简单控制台程序的 C 源代码 使用 cl exe 命令行 VC 编译器 对其进行编译 并使用 System Diagnostics Process 运行它 ASP Net应用程序运行在PC上

随机推荐