Asp.Net Core中的帐户角色框架(2)

上一篇在分析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个表如下:

  1. AspNetUsers 帐户
  2. AspNetRoles 角色
  3. AspNetUserRoles 帐户角色关联
  4. AspNetUserTokens 用于外部验证的 token 存储
  5. AspNetUserLogins 保留 第3方/外部 login 的信息
  6. AspNetUserClaims 帐户扩展字段
  7. AspNetRoleClaims 角色扩展字段

二、对于如上7个表,也同步定义了对应的实体:

  1. IdentityUser
  2. IdentityRole
  3. IdentityUserRole
  4. IdentityUserToken
  5. IdentityUserLogin
  6. IdentityUserClaim
  7. IdentityRoleClaim

三、实体是需要和物理表之间建议映射,这需要创建DbContext文件。

  1. IdentityUserContext,这个建立User类的实体和User相关物理表的上下文
  2. IdentityDbContext,继承自UserContext,扩展建立Role类实体和Role相关物理表的上下文

四、再扩展出实体操作类,对应的文件是

  1. UserStoreBase
  2. UserOnlyStore
  3. RoleStoreBase
  4. UserStore
  5. RoleStore

五、继续扩展,将是业务管理类,对应的文件是

  1. UserManager
  2. RoleManager
  3. AspNetUserManager
  4. AspNetRoleManager
  5. SignInManager

六、再继续扩展,就属于UI这一块了。