Настройка ASP.NET Core Identity
ASP.NET Core Identity использует значения по умолчанию для параметров, таких как политика паролей, блокировка и cookie конфигурация. Эти параметры можно переопределить при запуске приложения.
Identity options
Класс IdentityOptions представляет параметры, которые можно использовать для настройки Identity системы. IdentityOptions необходимо задать после вызова AddIdentity или AddDefaultIdentity.
Претензии Identity
IdentityOptions.ClaimsIdentity указывает ClaimsIdentityOptions свойства, показанные в следующей таблице.
Свойство | Description | По умолч. |
---|---|---|
RoleClaimType | Возвращает или задает тип утверждения, используемого для утверждения роли. | ClaimTypes.Role |
SecurityStampClaimType | Возвращает или задает тип утверждения, используемого для утверждения метки безопасности. | AspNet.Identity.SecurityStamp |
UserIdClaimType | Возвращает или задает тип утверждения, используемого для утверждения идентификатора пользователя. | ClaimTypes.NameIdentifier |
UserNameClaimType | Возвращает или задает тип утверждения, используемого для утверждения имени пользователя. | ClaimTypes.Name |
Заблокировано
Блокировка задана в методе PasswordSignInAsync :
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe,
lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Предыдущий код основан на шаблонеIdentityLogin
.
Параметры блокировки задаются в Program.cs
:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Default Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Предыдущий IdentityOptions LockoutOptions код задает значения по умолчанию.
Успешная проверка подлинности сбрасывает количество неудачных попыток доступа и сбрасывает часы.
IdentityOptions.Lockout указывает LockoutOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
AllowedForNewUsers | Определяет, может ли новый пользователь быть заблокирован. | true |
DefaultLockoutTimeSpan | Время блокировки пользователя при возникновении блокировки. | 5 мин |
MaxFailedAccessAttempts | Количество неудачных попыток доступа, пока пользователь не будет заблокирован, если блокировка включена. | 5 |
Пароль
По умолчанию требуется, Identity чтобы пароли содержали прописные символы, строчные буквы, цифру и буквенно-цифровые символы. Пароли должны иметь по крайней мере шесть символов.
Пароли настроены следующим образом:
- PasswordOptions в
Program.cs
; [StringLength]
атрибуты свойств,Password
если Identity шаблон в приложении.InputModel
Password
свойства находятся в следующих файлах:Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using RPauth.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Default Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
});
var app = builder.Build();
// Remaining code removed for brevity.
IdentityOptions.Password указывает PasswordOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
RequireDigit | Требуется число от 0 до 9 в пароле. | true |
RequiredLength | Минимальная длина пароля. | 6 |
RequireLowercase | Требуется строчный символ в пароле. | true |
RequireNonAlphanumeric | Требуется символ, отличный от буквы, в пароле. | true |
RequiredUniqueChars | Применяется только к ASP.NET Core 2.0 или более поздней версии. Требуется количество разных символов в пароле. |
1 |
RequireUppercase | Требуется символ верхнего регистра в пароле. | true |
Вход
Следующий код задает SignIn
параметры (значения по умолчанию):
builder.Services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn указывает SignInOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
RequireConfirmedEmail | Требуется подтверждение электронной почты для входа. | false |
RequireConfirmedPhoneNumber | Требуется подтвержденный номер телефона для входа. | false |
Токены
IdentityOptions.Tokens указывает TokenOptions свойства, отображаемые в таблице.
Свойство | Description |
---|---|
AuthenticatorTokenProvider | Возвращает или задает используемый AuthenticatorTokenProvider для проверки двухфакторных входов с помощью средства проверки подлинности. |
ChangeEmailTokenProvider | Возвращает или задает используемый ChangeEmailTokenProvider для создания маркеров, используемых в сообщениях подтверждения изменений электронной почты. |
ChangePhoneNumberTokenProvider | Возвращает или задает используемый ChangePhoneNumberTokenProvider для создания маркеров, используемых при изменении номеров телефонов. |
EmailConfirmationTokenProvider | Возвращает или задает поставщик маркеров, используемый для создания маркеров, используемых в сообщениях электронной почты подтверждения учетной записи. |
PasswordResetTokenProvider | Возвращает или задает используемый IUserTwoFactorTokenProvider<TUser> для создания маркеров, используемых в сообщениях электронной почты сброса пароля. |
ProviderMap | Используется для создания поставщика маркеров пользователя с ключом, используемым в качестве имени поставщика. |
User
builder.Services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User указывает UserOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
AllowedUserNameCharacters | Допустимые символы в имени пользователя. | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 -._@+ |
RequireUniqueEmail | Требует, чтобы у каждого пользователя был уникальный адрес электронной почты. | false |
ПараметрыCookie
Настройка приложения cookie в Program.cs
. Настройка ConfigureApplicationCookie должна вызываться после вызова AddIdentity
или AddDefaultIdentity
.
builder.Services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
Дополнительные сведения см. в разделе CookieAuthenticationOptions.
Параметры хэша паролей
PasswordHasherOptions возвращает и задает параметры хэширования паролей.
Вариант | Описание |
---|---|
CompatibilityMode | Режим совместимости, используемый при хэширования новых паролей. По умолчанию — IdentityV3. Первый байт хэшированного пароля, называемый маркером формата, указывает версию алгоритма хэширования, используемого для хэширования пароля. При проверке пароля на хэш VerifyHashedPassword метод выбирает правильный алгоритм на основе первого байта. Клиент может пройти проверку подлинности независимо от того, какая версия алгоритма использовалась для хэширования пароля. Настройка режима совместимости влияет на хэширование новых паролей. |
IterationCount | Количество итераций, используемых при хэширование паролей с помощью PBKDF2. Это значение используется только в том случае, если CompatibilityMode задано значение IdentityV3. Значение должно быть положительным целым числом и значением по умолчанию 100000 . |
В следующем примере IterationCount задано значение 12000
in Program.cs
:
// using Microsoft.AspNetCore.Identity;
builder.Services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
Глобально требуется проверка подлинности всех пользователей
Дополнительные сведения о том, как глобально требовать проверку подлинности всех пользователей, см. в разделе Требовать проверку подлинности пользователей.
ISecurityStampValidator и SignOut везде
Приложения должны реагировать на события, связанные с конфиденциальными действиями безопасности, повторно создав пользователей ClaimsPrincipal. Например, ClaimsPrincipal
необходимо повторно создать при присоединении роли, изменении пароля или других конфиденциальных событиях безопасности. IdentityISecurityStampValidator использует интерфейс для повторного ClaimsPrincipal
создания . Реализация по умолчанию Identity регистрирует SecurityStampValidator с основным приложением cookie и двумя факторамиcookie. Проверяющий обработчик подключается к OnValidatePrincipal событию каждого cookie Identity вызова, чтобы убедиться, что утверждение метки безопасности пользователя не изменяется от того, что хранится в файле cookie. Проверяющий элемент вызывается через регулярные интервалы. Интервал вызова является компромиссом между попаданием в хранилище данных слишком часто и недостаточно часто. Проверка с длинным интервалом приводит к устаревшим утверждениям. Вызов принудительной userManager.UpdateSecurityStampAsync(user)
проверки существующих файлов cookie, которые будут недействительными при следующем проверке. Большинство учетных записей пользовательского Identity интерфейса и управление страницами вызываются userManager.UpdateSecurityStampAsync(user)
после изменения пароля или добавления имени входа. Приложения могут вызывать userManager.UpdateSecurityStampAsync(user)
реализацию действия выхода во всем мире.
Изменение интервала проверки отображается в следующем выделенном коде:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebClaimsPrincipal.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
// Force Identity's security stamp to be validated every minute.
builder.Services.Configure<SecurityStampValidatorOptions>(o =>
o.ValidationInterval = TimeSpan.FromMinutes(1));
builder.Services.AddRazorPages();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
ASP.NET Core Identity использует значения по умолчанию для параметров, таких как политика паролей, блокировка и cookie конфигурация. Эти параметры можно переопределить в Startup
классе.
Identity options
Класс IdentityOptions представляет параметры, которые можно использовать для настройки Identity системы. IdentityOptions
необходимо задать после вызова AddIdentity
или AddDefaultIdentity
.
Претензии Identity
IdentityOptions.ClaimsIdentity указывает ClaimsIdentityOptions свойства, показанные в следующей таблице.
Свойство | Description | По умолч. |
---|---|---|
RoleClaimType | Возвращает или задает тип утверждения, используемого для утверждения роли. | ClaimTypes.Role |
SecurityStampClaimType | Возвращает или задает тип утверждения, используемого для утверждения метки безопасности. | AspNet.Identity.SecurityStamp |
UserIdClaimType | Возвращает или задает тип утверждения, используемого для утверждения идентификатора пользователя. | ClaimTypes.NameIdentifier |
UserNameClaimType | Возвращает или задает тип утверждения, используемого для утверждения имени пользователя. | ClaimTypes.Name |
Заблокировано
Блокировка задана в методе PasswordSignInAsync :
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe,
lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl,
Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Предыдущий код основан на шаблоне Login
Identity .
Параметры блокировки задаются в StartUp.ConfigureServices
:
services.Configure<IdentityOptions>(options =>
{
// Default Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
});
Предыдущий IdentityOptions LockoutOptions код задает значения по умолчанию.
Успешная проверка подлинности сбрасывает количество неудачных попыток доступа и сбрасывает часы.
IdentityOptions.Lockout указывает LockoutOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
AllowedForNewUsers | Определяет, может ли новый пользователь быть заблокирован. | true |
DefaultLockoutTimeSpan | Время блокировки пользователя при возникновении блокировки. | 5 мин |
MaxFailedAccessAttempts | Количество неудачных попыток доступа, пока пользователь не будет заблокирован, если блокировка включена. | 5 |
Пароль
По умолчанию требуется, Identity чтобы пароли содержали прописные символы, строчные буквы, цифру и буквенно-цифровые символы. Пароли должны иметь по крайней мере шесть символов.
Пароли настроены следующим образом:
- PasswordOptions в
Startup.ConfigureServices
; [StringLength]
атрибуты свойств,Password
если Identity шаблон в приложении.InputModel
Password
свойства находятся в следующих файлах:Areas/Identity/Pages/Account/Register.cshtml.cs
Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
services.Configure<IdentityOptions>(options =>
{
// Default Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
});
IdentityOptions.Password указывает PasswordOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
RequireDigit | Требуется число от 0 до 9 в пароле. | true |
RequiredLength | Минимальная длина пароля. | 6 |
RequireLowercase | Требуется строчный символ в пароле. | true |
RequireNonAlphanumeric | Требуется символ, отличный от буквы, в пароле. | true |
RequiredUniqueChars | Применяется только к ASP.NET Core 2.0 или более поздней версии. Требуется количество разных символов в пароле. |
1 |
RequireUppercase | Требуется символ верхнего регистра в пароле. | true |
Вход
Следующий код задает SignIn
параметры (значения по умолчанию):
services.Configure<IdentityOptions>(options =>
{
// Default SignIn settings.
options.SignIn.RequireConfirmedEmail = false;
options.SignIn.RequireConfirmedPhoneNumber = false;
});
IdentityOptions.SignIn указывает SignInOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
RequireConfirmedEmail | Требуется подтверждение электронной почты для входа. | false |
RequireConfirmedPhoneNumber | Требуется подтвержденный номер телефона для входа. | false |
Токены
IdentityOptions.Tokens указывает TokenOptions свойства, отображаемые в таблице.
Свойство | Description |
---|---|
AuthenticatorTokenProvider | Возвращает или задает используемый AuthenticatorTokenProvider для проверки двухфакторных входов с помощью средства проверки подлинности. |
ChangeEmailTokenProvider | Возвращает или задает используемый ChangeEmailTokenProvider для создания маркеров, используемых в сообщениях подтверждения изменений электронной почты. |
ChangePhoneNumberTokenProvider | Возвращает или задает используемый ChangePhoneNumberTokenProvider для создания маркеров, используемых при изменении номеров телефонов. |
EmailConfirmationTokenProvider | Возвращает или задает поставщик маркеров, используемый для создания маркеров, используемых в сообщениях электронной почты подтверждения учетной записи. |
PasswordResetTokenProvider | Возвращает или задает используемый IUserTwoFactorTokenProvider<TUser> для создания маркеров, используемых в сообщениях электронной почты сброса пароля. |
ProviderMap | Используется для создания поставщика маркеров пользователя с ключом, используемым в качестве имени поставщика. |
User
services.Configure<IdentityOptions>(options =>
{
// Default User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
IdentityOptions.User указывает UserOptions свойства, отображаемые в таблице.
Свойство | Description | По умолч. |
---|---|---|
AllowedUserNameCharacters | Допустимые символы в имени пользователя. | abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 -._@+ |
RequireUniqueEmail | Требует, чтобы у каждого пользователя был уникальный адрес электронной почты. | false |
ПараметрыCookie
Настройка приложения cookie в Startup.ConfigureServices
. Настройка ConfigureApplicationCookie должна вызываться после вызова AddIdentity
или AddDefaultIdentity
.
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.Cookie.Name = "YourAppCookieName";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Identity/Account/Login";
// ReturnUrlParameter requires
//using Microsoft.AspNetCore.Authentication.Cookies;
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
Дополнительные сведения см. в разделе CookieAuthenticationOptions.
Параметры хэша паролей
PasswordHasherOptions возвращает и задает параметры хэширования паролей.
Вариант | Описание |
---|---|
CompatibilityMode | Режим совместимости, используемый при хэширования новых паролей. По умолчанию — IdentityV3. Первый байт хэшированного пароля, называемый маркером формата, указывает версию алгоритма хэширования, используемого для хэширования пароля. При проверке пароля на хэш VerifyHashedPassword метод выбирает правильный алгоритм на основе первого байта. Клиент может пройти проверку подлинности независимо от того, какая версия алгоритма использовалась для хэширования пароля. Настройка режима совместимости влияет на хэширование новых паролей. |
IterationCount | Количество итераций, используемых при хэширование паролей с помощью PBKDF2. Это значение используется только в том случае, если CompatibilityMode задано значение IdentityV3. Значение должно быть положительным целым числом и значением по умолчанию 10000 . |
В следующем примере IterationCount задано значение 12000
in Startup.ConfigureServices
:
// using Microsoft.AspNetCore.Identity;
services.Configure<PasswordHasherOptions>(option =>
{
option.IterationCount = 12000;
});
Глобально требуется проверка подлинности всех пользователей
Дополнительные сведения о том, как глобально требовать проверку подлинности всех пользователей, см. в разделе Требовать проверку подлинности пользователей.
ASP.NET Core