Настройка ASP.NET Core Identity

ASP.NET Core Identity использует значения по умолчанию для параметров, таких как политика паролей, блокировка и конфигурация cookie. Эти параметры можно переопределить при запуске приложения.

параметры

Класс представляет параметры, которые можно использовать для настройки системы. необходимо задать после вызова или .

Претензии

задает свойства, приведенные в следующей таблице.

Свойство Описание По умолчанию
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();
}

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

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

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();

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

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

определяет со свойствами, указанными в таблице.

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

Пароль

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

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

  • в ;
  • атрибуты свойств , если интегрирован в приложение с использованием шаблона . свойства находятся в следующих файлах:
    • 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.

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
RequireDigit Требуется число от 0 до 9 в пароле. true
RequiredLength Минимальная длина пароля. 6
RequireLowercase Требуется буква в нижнем регистре в пароле. true
RequireNonAlphanumeric Требуется символ, отличный от буквы, в пароле. true
RequiredUniqueChars Применяется только к ASP.NET Core 2.0 или более поздней версии.

Требуется количество разных символов в пароле.
1
RequireUppercase Требуется символ верхнего регистра в пароле. true

Вход

Следующий код задает параметры (значения по умолчанию):

builder.Services.Configure<IdentityOptions>(options =>
{
    // Default SignIn settings.
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedPhoneNumber = false;
});

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
RequireConfirmedEmail Требуется подтверждение электронной почты для входа. false
RequireConfirmedPhoneNumber Требуется подтвержденный номер телефона для входа. false

Токены

определяет со свойствами, указанными в таблице.

Свойство Описание
AuthenticatorTokenProvider Возвращает или задает , используемый для верификации двухфакторной аутентификации с помощью аутентификатора.
ChangeEmailTokenProvider Возвращает или задает используемый для генерации токенов, используемых в электронных письмах подтверждения изменения адреса.
ChangePhoneNumberTokenProvider Возвращает или задает используемый для создания маркеров, используемых при изменении номеров телефонов.
EmailConfirmationTokenProvider Возвращает или задает поставщика токенов, используемого для генерации токенов, используемых в электронных письмах с подтверждением учетной записи.
PasswordResetTokenProvider Возвращает или задает используемый для создания токенов, используемых в сообщениях электронной почты сброса пароля.
ProviderMap Используется для создания поставщика маркеров пользователя User Token Provider с ключом, используемым в качестве его имени.

Пользователь

builder.Services.Configure<IdentityOptions>(options =>
{
    // Default User settings.
    options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;

});

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
AllowedUserNameCharacters Допустимые символы в имени пользователя. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Требует, чтобы у каждого пользователя был уникальный адрес электронной почты. false

Настройте приложение в . ConfigureApplicationCookie должна вызываться после вызова , или .

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;
});

Дополнительные сведения см. в разделе .

Параметры хэша паролей

возвращает и задает параметры хэширования паролей.

Вариант Описание
CompatibilityMode Режим совместимости, используемый при хэширования новых паролей. По умолчанию — . Первый байт хэшированного пароля, называемый маркером формата, указывает версию алгоритма хэширования, используемого для хэширования пароля. При проверке пароля на хэш метод выбирает правильный алгоритм на основе первого байта. Клиент может пройти проверку подлинности независимо от того, какая версия алгоритма использовалась для хэширования пароля. Настройка режима совместимости влияет на хэширование новых паролей.
IterationCount Количество итераций, используемых при хэширование паролей с помощью PBKDF2. Это значение используется только в том случае, если установлено в . Значение должно быть положительным целым числом и значением по умолчанию .

В следующем примере задано значение in :

// using Microsoft.AspNetCore.Identity;

builder.Services.Configure<PasswordHasherOptions>(option =>
{
    option.IterationCount = 12000;
});

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

Сведения о том, как требовать проверку подлинности для всех пользователей приложений, см. в статье Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией.

ISecurityStampValidator и SignOut повсюду

Приложения должны реагировать на события, связанные с действиями, затрагивающими безопасность, восстанавливая учетные данные пользователей . Например, необходимо повторно создать при присоединении роли, изменении пароля или других событиях, связанных с безопасностью. использует интерфейс для регенерации . Реализация по умолчанию регистрирует SecurityStampValidator с основным приложением и двухфакторной аутентификацией. Проверяющий модуль подключается к событию каждого , чтобы вызвать и убедиться, что заявление о штампе безопасности пользователя не изменилось в сравнении с тем, что хранится в . Валидатор вызывается с регулярными интервалами. Интервал вызова является компромиссом между обращением к хранилищу данных слишком часто или слишком редко. Проверка с длинным интервалом приводит к устаревшим утверждениям. Вызов для того, чтобы существующие файлы cookie стали недействительными при следующей проверке. Большинство страниц пользовательского интерфейса и управления вызывают после изменения пароля или добавления имени входа. Приложения могут вызывать , чтобы выполнить действие выхода изо всех учетных записей.

Изменение интервала проверки отображается в следующем выделенном коде:

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. Эти параметры можно переопределить в классе.

параметры

Класс представляет параметры, которые можно использовать для настройки системы. необходимо задать после вызова или .

Претензии

задает свойства, приведенные в следующей таблице.

Свойство Описание По умолчанию
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();
}

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

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

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

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

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

определяет со свойствами, указанными в таблице.

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

Пароль

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

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

  • в ;
  • атрибуты свойств , если интегрирован в приложение с использованием шаблона . свойства находятся в следующих файлах:
    • 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;
});

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
RequireDigit Требуется число от 0 до 9 в пароле. true
RequiredLength Минимальная длина пароля. 6
RequireLowercase Требуется буква в нижнем регистре в пароле. true
RequireNonAlphanumeric Требуется символ, отличный от буквы, в пароле. true
RequiredUniqueChars Применяется только к ASP.NET Core 2.0 или более поздней версии.

Требуется количество разных символов в пароле.
1
RequireUppercase Требуется символ верхнего регистра в пароле. true

Вход

Следующий код задает параметры (значения по умолчанию):

services.Configure<IdentityOptions>(options =>
{
    // Default SignIn settings.
    options.SignIn.RequireConfirmedEmail = false;
    options.SignIn.RequireConfirmedPhoneNumber = false;
});

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
RequireConfirmedEmail Требуется подтверждение электронной почты для входа. false
RequireConfirmedPhoneNumber Требуется подтвержденный номер телефона для входа. false

Токены

определяет со свойствами, указанными в таблице.

Свойство Описание
AuthenticatorTokenProvider Возвращает или задает , используемый для верификации двухфакторной аутентификации с помощью аутентификатора.
ChangeEmailTokenProvider Возвращает или задает используемый для генерации токенов, используемых в электронных письмах подтверждения изменения адреса.
ChangePhoneNumberTokenProvider Возвращает или задает используемый для создания маркеров, используемых при изменении номеров телефонов.
EmailConfirmationTokenProvider Возвращает или задает поставщика токенов, используемого для генерации токенов, используемых в электронных письмах с подтверждением учетной записи.
PasswordResetTokenProvider Возвращает или задает используемый для создания токенов, используемых в сообщениях электронной почты сброса пароля.
ProviderMap Используется для создания поставщика маркеров пользователя User Token Provider с ключом, используемым в качестве его имени.

Пользователь

services.Configure<IdentityOptions>(options =>
{
    // Default User settings.
    options.User.AllowedUserNameCharacters =
            "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;

});

определяет со свойствами, указанными в таблице.

Свойство Описание По умолчанию
AllowedUserNameCharacters Допустимые символы в имени пользователя. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Требует, чтобы у каждого пользователя был уникальный адрес электронной почты. false

Настройте приложение в . ConfigureApplicationCookie должна вызываться после вызова , или .

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;
});

Дополнительные сведения см. в разделе .

Параметры хэша паролей

возвращает и задает параметры хэширования паролей.

Вариант Описание
CompatibilityMode Режим совместимости, используемый при хэширования новых паролей. По умолчанию — . Первый байт хэшированного пароля, называемый маркером формата, указывает версию алгоритма хэширования, используемого для хэширования пароля. При проверке пароля на хэш метод выбирает правильный алгоритм на основе первого байта. Клиент может пройти проверку подлинности независимо от того, какая версия алгоритма использовалась для хэширования пароля. Настройка режима совместимости влияет на хэширование новых паролей.
IterationCount Количество итераций, используемых при хэширование паролей с помощью PBKDF2. Это значение используется только в том случае, если установлено в . Значение должно быть положительным целым числом и значением по умолчанию .

В следующем примере задано значение in :

// using Microsoft.AspNetCore.Identity;

services.Configure<PasswordHasherOptions>(option =>
{
    option.IterationCount = 12000;
});

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

Сведения о том, как требовать проверку подлинности для всех пользователей приложений, см. в статье Create приложение ASP.NET Core с данными пользователя, защищенными авторизацией.