配置 ASP.NET Core 标识Configure ASP.NET Core Identity

本文内容

ASP.NET Core 标识将默认值用于设置密码策略、锁定和 cookie 配置等设置。可以在 Startup 类中重写这些设置。

标识选项Identity options

IdentityOptions类表示可用于配置标识系统的选项。调用 AddIdentityAddDefaultIdentity必须设置 IdentityOptions

声明标识Claims Identity

IdentityOptions指定ClaimsIdentityOptions ,其中包含下表所示的属性。

properties说明默认
RoleClaimType获取或设置用于角色声明的声明类型。ClaimTypes
SecurityStampClaimType获取或设置用于安全戳声明的声明类型。AspNet.Identity.SecurityStamp
UserIdClaimType获取或设置用于用户标识符声明的声明类型。ClaimTypes. NameIdentifier
UserNameClaimType获取或设置用于用户名声明的声明类型。ClaimTypes.Name

锁定Lockout

PasswordSignInAsync方法中设置锁定:

  1. public async Task<IActionResult> OnPostAsync(string returnUrl = null)
  2. {
  3. returnUrl = returnUrl ?? Url.Content("~/");
  4. if (ModelState.IsValid)
  5. {
  6. var result = await _signInManager.PasswordSignInAsync(Input.Email,
  7. Input.Password, Input.RememberMe,
  8. lockoutOnFailure: false);
  9. if (result.Succeeded)
  10. {
  11. _logger.LogInformation("User logged in.");
  12. return LocalRedirect(returnUrl);
  13. }
  14. if (result.RequiresTwoFactor)
  15. {
  16. return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl,
  17. Input.RememberMe });
  18. }
  19. if (result.IsLockedOut)
  20. {
  21. _logger.LogWarning("User account locked out.");
  22. return RedirectToPage("./Lockout");
  23. }
  24. else
  25. {
  26. ModelState.AddModelError(string.Empty, "Invalid login attempt.");
  27. return Page();
  28. }
  29. }
  30. // If we got this far, something failed, redisplay form
  31. return Page();
  32. }

前面的代码基于 Login 标识模板。

StartUp.ConfigureServices中设置锁定选项:

  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Default Lockout settings.
  4. options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
  5. options.Lockout.MaxFailedAccessAttempts = 5;
  6. options.Lockout.AllowedForNewUsers = true;
  7. });

前面的代码将IdentityOptionsLockoutOptions设置为默认值。

成功的身份验证失败的访问尝试计数重置并重置时钟。

IdentityOptions指定LockoutOptions ,其中包含表中所示的属性。

properties说明默认
AllowedForNewUsers确定新用户是否可以锁定。true
DefaultLockoutTimeSpan锁定发生时用户被锁定的时间长度。5 分钟
MaxFailedAccessAttempts如果启用了锁定,则在用户被锁定之前失败的访问尝试次数。5

密码Password

默认情况下,Identity 要求密码包含大写字符、小写字符、数字以及非字母数字字符。密码长度必须至少为6个字符。可以 Startup.ConfigureServices中设置PasswordOptions

  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Default Password settings.
  4. options.Password.RequireDigit = true;
  5. options.Password.RequireLowercase = true;
  6. options.Password.RequireNonAlphanumeric = true;
  7. options.Password.RequireUppercase = true;
  8. options.Password.RequiredLength = 6;
  9. options.Password.RequiredUniqueChars = 1;
  10. });
  1. services.AddIdentity<ApplicationUser, IdentityRole>(options =>
  2. {
  3. // Password settings
  4. options.Password.RequireDigit = true;
  5. options.Password.RequiredLength = 8;
  6. options.Password.RequiredUniqueChars = 2;
  7. options.Password.RequireLowercase = true;
  8. options.Password.RequireNonAlphanumeric = true;
  9. options.Password.RequireUppercase = true;
  10. })
  11. .AddEntityFrameworkStores<ApplicationDbContext>()
  12. .AddDefaultTokenProviders();
  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Password settings
  4. options.Password.RequireDigit = true;
  5. options.Password.RequiredLength = 8;
  6. options.Password.RequireNonAlphanumeric = false;
  7. options.Password.RequireUppercase = true;
  8. options.Password.RequireLowercase = false;
  9. });

IdentityOptions指定PasswordOptions ,其中包含表中所示的属性。

properties说明默认
RequireDigit要求密码中的数字介于0-9 之间。true
RequiredLength密码的最小长度。6
RequireLowercase密码中需要小写字符。true
RequireNonAlphanumeric密码中需要一个非字母数字字符。true
RequiredUniqueChars仅适用于 ASP.NET Core 2.0 或更高版本。需要密码中的非重复字符数。1
RequireUppercase密码中需要大写字符。true
properties说明默认
RequireDigit要求密码中的数字介于0-9 之间。true
RequiredLength密码的最小长度。6
RequireLowercase密码中需要小写字符。true
RequireNonAlphanumeric密码中需要一个非字母数字字符。true
RequireUppercase密码中需要大写字符。true

登录Sign-in

下面的代码将 SignIn 设置(设置为默认值):

  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Default SignIn settings.
  4. options.SignIn.RequireConfirmedEmail = false;
  5. options.SignIn.RequireConfirmedPhoneNumber = false;
  6. });
  1. services.AddIdentity<ApplicationUser, IdentityRole>(options =>
  2. {
  3. // Signin settings
  4. options.SignIn.RequireConfirmedEmail = true;
  5. options.SignIn.RequireConfirmedPhoneNumber = false;
  6. })
  7. .AddEntityFrameworkStores<ApplicationDbContext>()
  8. .AddDefaultTokenProviders();

IdentityOptions指定SignInOptions ,其中包含表中所示的属性。

properties说明默认
RequireConfirmedEmail需要确认电子邮件登录。false
RequireConfirmedPhoneNumber需要确认电话号码才能登录。false

令牌Tokens

IdentityOptions指定TokenOptions ,其中包含表中所示的属性。

properties说明
AuthenticatorTokenProvider获取或设置用于使用验证器验证双重登录的 AuthenticatorTokenProvider
ChangeEmailTokenProvider获取或设置用于生成电子邮件更改确认电子邮件中使用的令牌的 ChangeEmailTokenProvider
ChangePhoneNumberTokenProvider获取或设置用于生成更改电话号码时使用的令牌的 ChangePhoneNumberTokenProvider
EmailConfirmationTokenProvider获取或设置用于生成帐户确认电子邮件中使用的令牌的令牌提供程序。
PasswordResetTokenProvider获取或设置用于生成密码重置电子邮件中使用的令牌的IUserTwoFactorTokenProvider<TUser >
ProviderMap用于使用用作提供程序名称的密钥构造用户令牌提供程序

用户User

  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Default User settings.
  4. options.User.AllowedUserNameCharacters =
  5. "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
  6. options.User.RequireUniqueEmail = false;
  7. });

IdentityOptions指定UserOptions ,其中包含表中所示的属性。

properties说明默认
AllowedUserNameCharacters用户名中允许使用的字符。abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+
RequireUniqueEmail要求每个用户都有唯一的电子邮件。false

Cookie 设置Cookie settings

Startup.ConfigureServices中配置应用的 cookie。调用 AddIdentityAddDefaultIdentity,必须调用ConfigureApplicationCookie

  1. services.ConfigureApplicationCookie(options =>
  2. {
  3. options.AccessDeniedPath = "/Identity/Account/AccessDenied";
  4. options.Cookie.Name = "YourAppCookieName";
  5. options.Cookie.HttpOnly = true;
  6. options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
  7. options.LoginPath = "/Identity/Account/Login";
  8. // ReturnUrlParameter requires
  9. //using Microsoft.AspNetCore.Authentication.Cookies;
  10. options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
  11. options.SlidingExpiration = true;
  12. });
  1. services.ConfigureApplicationCookie(options =>
  2. {
  3. options.AccessDeniedPath = "/Account/AccessDenied";
  4. options.Cookie.Name = "YourAppCookieName";
  5. options.Cookie.HttpOnly = true;
  6. options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
  7. options.LoginPath = "/Account/Login";
  8. // ReturnUrlParameter requires `using Microsoft.AspNetCore.Authentication.Cookies;`
  9. options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
  10. options.SlidingExpiration = true;
  11. });
  1. services.Configure<IdentityOptions>(options =>
  2. {
  3. // Cookie settings
  4. options.Cookies.ApplicationCookie.CookieName = "YourAppCookieName";
  5. options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(150);
  6. options.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn";
  7. options.Cookies.ApplicationCookie.AccessDeniedPath = "/Account/AccessDenied";
  8. options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
  9. // Requires `using Microsoft.AspNetCore.Authentication.Cookies;`
  10. options.Cookies.ApplicationCookie.AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  11. options.Cookies.ApplicationCookie.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
  12. });

有关详细信息,请参阅cookieauthenticationoptions.authenticationtype

Password Hasher 选项Password Hasher options

PasswordHasherOptions 获取和设置用于密码哈希的选项。

选项说明
CompatibilityMode对新密码进行哈希处理时使用的兼容性模式。默认为 IdentityV3哈希密码的第一个字节称为格式标记,它指定用于对密码进行哈希处理的哈希算法的版本。针对哈希验证密码时,VerifyHashedPassword 方法基于第一个字节选择正确的算法。无论使用哪个版本的算法对密码进行哈希处理,客户端都可以进行身份验证。设置兼容性模式会影响新密码的哈希。
IterationCount使用 PBKDF2 对密码进行哈希处理时使用的迭代次数。仅当 CompatibilityMode 设置为 IdentityV3时,才使用此值。该值必须是一个正整数,默认值为 10000

在下面的示例中,将 IterationCount 设置为 Startup.ConfigureServices12000

  1. // using Microsoft.AspNetCore.Identity;
  2. services.Configure<PasswordHasherOptions>(option =>
  3. {
  4. option.IterationCount = 12000;
  5. });