上一篇在分析Authentication时,我们知道需要通过Option来设置AuthenticateScheme,可以设置多重的验证方案,另外,还需要设置DefaultAuthenticateScheme,代表默认方案。
但我们在通常的Program.cs中并不能时时看到配置AuthenticateScheme,这是因为,身份验证,还需要有一套身份体系,这就是Identity。
在Program.cs中,我们通常用AddIdentity来启用Identity。
在AddIdentity代码中,我们可以看到如下内容:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddCookie(IdentityConstants.ApplicationScheme, o =>
{
o.LoginPath = new PathString("/Account/Login");
o.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync
};
})
.AddCookie(IdentityConstants.ExternalScheme, o =>
{
o.Cookie.Name = IdentityConstants.ExternalScheme;
o.ExpireTimeSpan = TimeSpan.FromMinutes(5);
})
.AddCookie(IdentityConstants.TwoFactorRememberMeScheme, o =>
{
o.Cookie.Name = IdentityConstants.TwoFactorRememberMeScheme;
o.Events = new CookieAuthenticationEvents
{
OnValidatePrincipal = SecurityStampValidator.ValidateAsync<ITwoFactorSecurityStampValidator>
};
})
.AddCookie(IdentityConstants.TwoFactorUserIdScheme, o =>
{
o.Cookie.Name = IdentityConstants.TwoFactorUserIdScheme;
o.ExpireTimeSpan = TimeSpan.FromMinutes(5);
});
这里设置了DefaultAuthenticateScheme,并启用Cookie验证方案。
Identity,这是一整套完整的帐户角色,可以分为如下几块:
一、最核心的就是帐户角色表,默认7个表如下:
- AspNetUsers 帐户
- AspNetRoles 角色
- AspNetUserRoles 帐户角色关联
- AspNetUserTokens 用于外部验证的 token 存储
- AspNetUserLogins 保留 第3方/外部 login 的信息
- AspNetUserClaims 帐户扩展字段
- AspNetRoleClaims 角色扩展字段
二、对于如上7个表,也同步定义了对应的实体:
- IdentityUser
- IdentityRole
- IdentityUserRole
- IdentityUserToken
- IdentityUserLogin
- IdentityUserClaim
- IdentityRoleClaim
三、实体是需要和物理表之间建议映射,这需要创建DbContext文件。
- IdentityUserContext,这个建立User类的实体和User相关物理表的上下文
- IdentityDbContext,继承自UserContext,扩展建立Role类实体和Role相关物理表的上下文
四、再扩展出实体操作类,对应的文件是
- UserStoreBase
- UserOnlyStore
- RoleStoreBase
- UserStore
- RoleStore
五、继续扩展,将是业务管理类,对应的文件是
- UserManager
- RoleManager
- AspNetUserManager
- AspNetRoleManager
- SignInManager
六、再继续扩展,就属于UI这一块了。