一、序言
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。
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
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);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
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 =>{})
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
作者:꧁执笔小白꧂