ASP.NETCore-中间件Middleware(七)_认证中间件-Identity组件库与Claims身份信息

一、序言

  Identity:身份组件库;使用管理用户、密码、配置文件数据、角色、声明、令牌、电子邮件确认等。

二、常用成员(WebAPI;无UI)

1、部分方法(知道即可;我的框架中没有用这些)

  全部方法见:Microsoft.AspNetCore.Identity 命名空间

  //Microsoft.AspNetCore.Identity.IdentityBuilder;         // 用于配置标识服务的帮助程序函数。
  //Microsoft.AspNetCore.Identity.IdentityCookiesBuilder;  //用于配置标识 Cookie 选项。
  //Microsoft.AspNetCore.Identity.ClaimsIdentityOptions;   // 用于配置用于已知声明的声明类型的选项。

  //Microsoft.AspNetCore.Identity.UserOptions;    // 用于用户验证的选项。

  //Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory;  // 提供为给定用户创建声明主体的方法。

  //Microsoft.AspNetCore.Identity.SignInOptions;  // 用于配置登录的选项。
  //Microsoft.AspNetCore.Identity.SignInManager;  // 提供用于用户登录的 API。
  //Microsoft.AspNetCore.Identity.SignInResult;   // 表示登录操作的结果。

  //Microsoft.AspNetCore.Identity.RoleStoreBase;  // 为角色创建持久性存储的新实例。
  //Microsoft.AspNetCore.Identity.RoleManager;    // 提供用于在持久性存储中管理角色的 API。
  //Microsoft.AspNetCore.Identity.RoleValidator;  // 提供角色的验证服务。

  //Microsoft.AspNetCore.Identity.UserStoreBase;  // 为用户创建持久性存储的新实例。
  //Microsoft.AspNetCore.Identity.UserLoginInfo;  // 表示用户记录的登录信息和源。
  //Microsoft.AspNetCore.Identity.UserManager;    // 提供用于在持久性存储中管理用户的 API。
  //Microsoft.AspNetCore.Identity.UserValidator;  // 为用户类提供验证服务。

  //Microsoft.AspNetCore.Identity.PasswordOptions;        // 指定密码要求的选项。
  //Microsoft.AspNetCore.Identity.PasswordHasher;         // 实现标准标识密码哈希。
  //Microsoft.AspNetCore.Identity.PasswordHasherOptions;  // 指定用于密码哈希的选项。
  //Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode;  // 指定用于对密码进行哈希处理的格式。
  //Microsoft.AspNetCore.Identity.PasswordValidator;                // 提供标识的默认密码策略。
  //Microsoft.AspNetCore.Identity.PasswordVerificationResult;       // 指定密码验证的结果。

  //Microsoft.AspNetCore.Identity.TokenOptions;                     // 用户令牌的选项。
  //Microsoft.AspNetCore.Identity.TokenProviderDescriptor;          // 用于表示 的 TokenMap 中的 TokenOptions令牌提供程序。

  //Microsoft.AspNetCore.Identity.StoreOptions;       // 用于存储特定选项

  //Microsoft.AspNetCore.Identity.AspNetRoleManager;  // 提供用于在持久性存储中管理角色的 API。
  //Microsoft.AspNetCore.Identity.AspNetUserManager;  // 提供用于在持久性存储中管理用户的 API。

2、ClaimsPrincipal-记录用户身份(重点):

  • ClaimsPrincipal:证件持有者;ClaimsPrincipal 是 ClaimsIdentity 的持有者,就像我们拥有身份证一样。可以包含多个的 ClaimsIdentity。
    • ClaimsIdentity:证件;所有的 Claim身份信息 最终组成了我们的 身份证ClaimsIdentity。
      • Claims:每一项的证件信息;可以存放我们的姓名、性别、民族、出生日期、家庭住址、身份证号等身份信息,每一项数据的都可以看成是 type-value(数据类型-数据值)。
(1)使用示例
  var claims = new List<Claim>  // 维护用户信息
  {
      new Claim(ClaimTypes.Name, "2806933146@qq.com"),
      new Claim("FullName", "执笔小白"),  // key-value形式赋值
      new Claim(ClaimTypes.Role, "Administrator"),
  };

  var claimsIdentity = new ClaimsIdentity(  // claims添加到claimsIdentity
      claims, CookieAuthenticationDefaults.AuthenticationScheme)
      ;
  var claimsPrincipal = new ClaimsPrincipal(  // claimsIdentity添加到claimsPrincipal
      claimsIdentity);

3、Identity 自定义配置(一些Identity自带认证功能的实现)

  有些框架作者会用到这些东西,“自定义配置Identity ”算是淘汰掉的鸡肋东西。

#region 旧的配置方式-IdentityUser 结构分析
new IdentityUser()
{
  //PasswordHash = "",  // 密码的加盐和哈希表示形式
  //PhoneNumber = "12345678901",  // 电话号码
  //PhoneNumberConfirmed = true,  // 指示用户是否强制验证电话号码
  ////NormalizedEmail = "",         // 规范化电子邮件地址,允许的字符;
  //Email = "2806933146@qq.com",  // 邮箱号码
  //EmailConfirmed = false,       // 指示用户是否强制验证邮箱
  //LockoutEnd = DateTime.UtcNow,  // 锁定结束的日期和时间(单位:UTC)
  //LockoutEnabled = false,        // 指示是否需要锁定用户
  //AccessFailedCount = 5,  // 用户可尝试的登录失败的次数
  ////ConcurrencyStamp = Guid.NewGuid().ToString(),  // 一个随机值,每当用户被持久化到存储时,该值必须更改
  //SecurityStamp = Guid.NewGuid().ToString(),  // 一个随机值,每当用户凭据更改时必须更改(密码更改、登录删除)
  //TwoFactorEnabled = true  // 启用了双因素身份验证。
};
#endregion 旧的配置方式-IdentityUser 结构分析

#region 新的配置方式-builder.Services.AddIdentity<IdentityUser,IdentityRole>(options =>{})
  builder.Services.AddIdentity<IdentityUser,IdentityRole>(options =>
  {
      #region 旧的配置形式-IdentityUser
      //new IdentityUser()
      //{
      //    //PasswordHash = "",  // 密码的加盐和哈希表示形式
      //    //PhoneNumber = "12345678901",  // 电话号码
      //    //PhoneNumberConfirmed = true,  // 指示用户是否强制验证电话号码
      //    ////NormalizedEmail = "",         // 规范化电子邮件地址,允许的字符;
      //    //Email = "2806933146@qq.com",  // 邮箱号码
      //    //EmailConfirmed = false,       // 指示用户是否强制验证邮箱
      //    //LockoutEnd = DateTime.UtcNow,  // 锁定结束的日期和时间(单位:UTC)
      //    //LockoutEnabled = false,        // 指示是否需要锁定用户
      //    //AccessFailedCount = 5,  // 用户可尝试的登录失败的次数
      //    ////ConcurrencyStamp = Guid.NewGuid().ToString(),  // 一个随机值,每当用户被持久化到存储时,该值必须更改
      //    //SecurityStamp = Guid.NewGuid().ToString(),  // 一个随机值,每当用户凭据更改时必须更改(密码更改、登录删除)
      //    //TwoFactorEnabled = true  // 启用了双因素身份验证。

      //    //RequireUniqueEmail = true,  // 要求Email唯一
      //    //AllowedUserNameCharacters =""  // 规范化用户名,允许的字符;默认是 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+
      //};
      #endregion 旧的配置形式-IdentityUser

      // 配置用户名
      options.User = new UserOptions()
      {
          RequireUniqueEmail = true,  // 要求Email唯一
          //AllowedUserNameCharacters =""  // 规范化用户名,允许的字符;默认是 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+
      };
      // 配置密码
      options.Password =new PasswordOptions()
      {
          RequiredLength = 10,      // 要求密码最小长度,默认是 6 个字符
          RequiredUniqueChars = 3,  // 要求至少要包含的字母数
          RequireDigit = true,      // 要求有数字
          RequireUppercase = true,  // 要求有大写字母
          RequireLowercase = true,  // 要求有小写字母
          RequireNonAlphanumeric = true,  // 要求有特殊字符
      };
      // 令牌配置
      options.Tokens =new TokenOptions()
      {
          AuthenticatorTokenProvider = "MyAuthenticatorTokenProvider",  // 认证令牌的提供者
          PasswordResetTokenProvider = "MyPasswordResetTokenProvider",  // 重置密码的令牌提供者
          ChangeEmailTokenProvider = "MyChangeEmailTokenProvider",              // 更换邮箱的令牌提供者
          ChangePhoneNumberTokenProvider = "MyChangePhoneNumberTokenProvider",  // 更换手机号的令牌提供者
          EmailConfirmationTokenProvider = "MyEmailConfirmationTokenProvider",  // 验证邮箱的令牌提供者

          AuthenticatorIssuer = "Identity",  // 认证的消费者

          ProviderMap = new Dictionary<string, TokenProviderDescriptor>()  // 将用于构造UserTokenProviders,并将密钥用作providerName
      };
      // 锁定账户
      options.Lockout =new LockoutOptions()
      {
          AllowedForNewUsers = true,                       // 新用户锁定账户
          DefaultLockoutTimeSpan = TimeSpan.FromHours(1),  // 锁定时长,默认是5分钟
          MaxFailedAccessAttempts = 5                      // 登录错误最大尝试次数,默认5次
      };
      // 数据库存储
      options.Stores =new StoreOptions()
      {
          MaxLengthForKeys = 128,     // 主键的最大长度;默认为Max
          ProtectPersonalData = true  // 保护用户数据,要求实现 IProtectedUserStore 接口
      };
      // 登录认证配置
      options.SignIn =new SignInOptions()
      {
          RequireConfirmedAccount = true,     // 强制验证用户(确保用户提交了Account)
          RequireConfirmedEmail = true,       // 强制验证邮箱(确保用户提交了邮箱)
          RequireConfirmedPhoneNumber = true  // 强制验证电话号码(确保用户提交了电话号码)
      };
      // 声明式配置用户证件
      options.ClaimsIdentity = new ClaimsIdentityOptions()
      {
          UserIdClaimType = "UserId",      // 用户Id
          UserNameClaimType = "UserName",  // 用户名
          RoleClaimType = "Role",          // 角色
          EmailClaimType = "Email",        // 邮箱
          SecurityStampClaimType= "SecurityStamp"  // 一个随机值,每当用户凭据更改时必须更改(密码更改、登录删除)
      };
  });
#endregion 新的配置方式-builder.Services.AddIdentity<IdentityUser,IdentityRole>(options =>{})

 

posted @   ꧁执笔小白꧂  阅读(329)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
历史上的今天:
2020-03-30 使命召唤16:战区下载教程
2020-03-30 IIS-发布网站
点击右上角即可分享
微信分享提示