Настройка 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();

Предыдущий IdentityOptionsLockoutOptions код задает значения по умолчанию.

Успешная проверка подлинности сбрасывает количество неудачных попыток доступа и сбрасывает часы.

IdentityOptions.Lockout указывает LockoutOptions свойства, отображаемые в таблице.

Свойство Description По умолч.
AllowedForNewUsers Определяет, может ли новый пользователь быть заблокирован. true
DefaultLockoutTimeSpan Время блокировки пользователя при возникновении блокировки. 5 мин
MaxFailedAccessAttempts Количество неудачных попыток доступа, пока пользователь не будет заблокирован, если блокировка включена. 5

Пароль

По умолчанию требуется, Identity чтобы пароли содержали прописные символы, строчные буквы, цифру и буквенно-цифровые символы. Пароли должны иметь по крайней мере шесть символов.

Пароли настроены следующим образом:

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 в Program.cs. НастройкаApplicationCookie должна вызываться после вызова 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 событию каждого cookieIdentity вызова, чтобы убедиться, что утверждение метки безопасности пользователя не изменяется от того, что хранится в файле 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();
}

Предыдущий код основан на шаблоне LoginIdentity .

Параметры блокировки задаются в StartUp.ConfigureServices:

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

Предыдущий IdentityOptionsLockoutOptions код задает значения по умолчанию.

Успешная проверка подлинности сбрасывает количество неудачных попыток доступа и сбрасывает часы.

IdentityOptions.Lockout указывает LockoutOptions свойства, отображаемые в таблице.

Свойство Description По умолч.
AllowedForNewUsers Определяет, может ли новый пользователь быть заблокирован. true
DefaultLockoutTimeSpan Время блокировки пользователя при возникновении блокировки. 5 мин
MaxFailedAccessAttempts Количество неудачных попыток доступа, пока пользователь не будет заблокирован, если блокировка включена. 5

Пароль

По умолчанию требуется, Identity чтобы пароли содержали прописные символы, строчные буквы, цифру и буквенно-цифровые символы. Пароли должны иметь по крайней мере шесть символов.

Пароли настроены следующим образом:

  • PasswordOptions в Startup.ConfigureServices;
  • [StringLength] атрибуты свойств, Password если Identity шаблон в приложении. InputModelPassword свойства находятся в следующих файлах:
    • 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 в Startup.ConfigureServices. НастройкаApplicationCookie должна вызываться после вызова 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;
});

Глобально требуется проверка подлинности всех пользователей

Дополнительные сведения о том, как глобально требовать проверку подлинности всех пользователей, см. в разделе Требовать проверку подлинности пользователей.