Udostępnij za pośrednictwem


Konfigurowanie ASP.NET Core Identity

ASP.NET Core Identity używa wartości domyślnych dla ustawień, takich jak zasady haseł, blokada i cookie konfiguracja. Te ustawienia można zastąpić podczas uruchamiania aplikacji.

Identity Opcje

Klasa IdentityOptions reprezentuje opcje, których można użyć do skonfigurowania Identity systemu. IdentityOptions należy ustawić po wywołaniu AddIdentity metody lub AddDefaultIdentity.

Roszczeń Identity

IdentityOptions.ClaimsIdentity określa ClaimsIdentityOptions właściwość z właściwościami pokazanymi w poniższej tabeli.

Właściwości opis Wartość domyślna
RoleClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia roli. ClaimTypes.Role
SecurityStampClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia sygnatury zabezpieczeń. AspNet.Identity.SecurityStamp
UserIdClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia identyfikatora użytkownika. ClaimTypes.NameIdentifier
UserNameClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia nazwy użytkownika. ClaimTypes.Name

Blokady

Blokada jest ustawiona w metodzie 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();
}

Powyższy kod jest oparty na szablonieIdentityLogin.

Opcje blokady są ustawiane w pliku 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();

Powyższy kod ustawia IdentityOptions LockoutOptions wartości domyślne.

Pomyślne uwierzytelnienie resetuje liczbę nieudanych prób dostępu i resetuje zegar.

IdentityOptions.Lockout określa LockoutOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
AllowedForNewUsers Określa, czy nowy użytkownik może zostać zablokowany. true
DefaultLockoutTimeSpan Czas blokowania użytkownika w przypadku wystąpienia blokady. 5 min
MaxFailedAccessAttempts Liczba nieudanych prób dostępu do momentu zablokowania użytkownika, jeśli blokada jest włączona. 5

Hasło

Domyślnie Identity hasła zawierają wielkie litery, małe litery, cyfrę i znak inny niż alfanumeryczny. Hasła muszą mieć długość co najmniej sześciu znaków.

Hasła są konfigurowane przy użyciu:

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 określa PasswordOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
RequireDigit Wymaga liczby z zakresu od 0 do 9 w haśle. true
RequiredLength Minimalna długość hasła. 6
RequireLowercase Wymaga małego znaku w haśle. true
RequireNonAlphanumeric Wymaga znaku innego niż alfanumeryczne w haśle. true
RequiredUniqueChars Dotyczy tylko ASP.NET Core 2.0 lub nowszej.

Wymaga liczby odrębnych znaków w haśle.
1
RequireUppercase Wymaga wielkich liter w haśle. true

Logowanie

Poniższy kod ustawia SignIn ustawienia (do wartości domyślnych):

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

IdentityOptions.SignIn określa SignInOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
RequireConfirmedEmail Wymaga potwierdzonej wiadomości e-mail w celu zalogowania się. false
RequireConfirmedPhoneNumber Wymaga potwierdzonego numeru telefonu do zalogowania się. false

Tokeny

IdentityOptions.Tokens określa TokenOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis
AuthenticatorTokenProvider Pobiera lub ustawia AuthenticatorTokenProvider używane do weryfikowania logowania dwuskładnikowego przy użyciu wystawcy uwierzytelniającego.
ChangeEmailTokenProvider Pobiera lub ustawia ChangeEmailTokenProvider używane do generowania tokenów używanych w wiadomościach e-mail z potwierdzeniem zmiany wiadomości e-mail.
ChangePhoneNumberTokenProvider Pobiera lub ustawia ChangePhoneNumberTokenProvider używane do generowania tokenów używanych podczas zmieniania numerów telefonów.
EmailConfirmationTokenProvider Pobiera lub ustawia dostawcę tokenu używanego do generowania tokenów używanych w wiadomościach e-mail z potwierdzeniem konta.
PasswordResetTokenProvider Pobiera lub ustawia IUserTwoFactorTokenProvider<TUser> używane do generowania tokenów używanych w wiadomościach e-mail resetowania haseł.
ProviderMap Służy do konstruowania dostawcy tokenów użytkownika z kluczem używanym jako nazwa dostawcy.

User

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

});

IdentityOptions.User określa UserOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
AllowedUserNameCharacters Dozwolone znaki w nazwie użytkownika. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Wymaga, aby każdy użytkownik miał unikatową wiadomość e-mail. false

Skonfiguruj aplikację cookie w programie Program.cs. Polecenie ConfigureApplicationCookie musi być wywoływane po wywołaniu metody AddIdentity lub 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;
});

Aby uzyskać więcej informacji, zobacz CookieAuthenticationOptions.

Opcje skrótów haseł

PasswordHasherOptions pobiera i ustawia opcje tworzenia skrótów haseł.

Opcja Opis
CompatibilityMode Tryb zgodności używany podczas tworzenia skrótów nowych haseł. Wartość domyślna to IdentityV3. Pierwszy bajt skrótu hasła, nazywany znacznikiem formatu, określa wersję algorytmu wyznaczania wartości skrótu używanej do wyznaczania wartości skrótu hasła. Podczas weryfikowania hasła względem skrótu VerifyHashedPassword metoda wybiera prawidłowy algorytm na podstawie pierwszego bajtu. Klient może uwierzytelnić się niezależnie od wersji algorytmu użytej do utworzenia skrótu hasła. Ustawienie trybu zgodności wpływa na tworzenie skrótów nowych haseł.
IterationCount Liczba iteracji używanych podczas tworzenia skrótów haseł przy użyciu pliku PBKDF2. Ta wartość jest używana tylko wtedy, gdy CompatibilityMode parametr ma wartość IdentityV3. Wartość musi być dodatnią liczbą całkowitą i wartością domyślną .100000

W poniższym przykładzie parametr IterationCount jest ustawiony na 12000 wartość w Program.cspliku :

// using Microsoft.AspNetCore.Identity;

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

Globalnie wymaga uwierzytelnienia wszystkich użytkowników

Aby uzyskać informacje na temat globalnego wymagania uwierzytelnienia wszystkich użytkowników, zobacz Wymaganie uwierzytelnionych użytkowników.

ISecurityStampValidator i SignOut wszędzie

Aplikacje muszą reagować na zdarzenia dotyczące akcji poufnych zabezpieczeń przez ponowne wygenerowanie użytkowników ClaimsPrincipal. Na przykład ClaimsPrincipal element powinien być ponownie wygenerowany podczas dołączania do roli, zmiany hasła lub innych zdarzeń poufnych zabezpieczeń. Identityużywa interfejsu ISecurityStampValidator do ponownego wygenerowania .ClaimsPrincipal Domyślna implementacja Identity rejestru securityStampValidator z główną aplikacją cookie i dwuskładnikowym cookie. Moduł sprawdzania poprawności jest podłączony do OnValidatePrincipal zdarzenia każdego cookie z nich, aby wywołać metodę w Identity celu sprawdzenia, czy oświadczenie sygnatury zabezpieczeń użytkownika pozostaje niezmienione z tego, co jest przechowywane w elemencie cookie. Moduł sprawdzania poprawności jest wywoływany w regularnych odstępach czasu. Interwał wywołań jest kompromisem między zbyt częstym i niewystarczającym trafieniem do magazynu danych. Sprawdzanie z długim interwałem powoduje nieaktualne oświadczenia. Wywołaj polecenie userManager.UpdateSecurityStampAsync(user), aby wymusić unieważnienie istniejących plików cookie przy następnym sprawdzeniu. Większość konta interfejsu Identity użytkownika i zarządzanie wywołaniami userManager.UpdateSecurityStampAsync(user) stron po zmianie hasła lub dodaniu nazwy logowania. Aplikacje mogą wywoływać metodę userManager.UpdateSecurityStampAsync(user) implementowania akcji wylogowywanie wszędzie.

Zmiana interwału walidacji jest wyświetlana w następującym wyróżnionym kodzie:

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 używa wartości domyślnych dla ustawień, takich jak zasady haseł, blokada i cookie konfiguracja. Te ustawienia można zastąpić w Startup klasie .

Identity Opcje

Klasa IdentityOptions reprezentuje opcje, których można użyć do skonfigurowania Identity systemu. IdentityOptions należy ustawić po wywołaniu AddIdentity metody lub AddDefaultIdentity.

Roszczeń Identity

IdentityOptions.ClaimsIdentity określa ClaimsIdentityOptions właściwość z właściwościami pokazanymi w poniższej tabeli.

Właściwości opis Wartość domyślna
RoleClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia roli. ClaimTypes.Role
SecurityStampClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia sygnatury zabezpieczeń. AspNet.Identity.SecurityStamp
UserIdClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia identyfikatora użytkownika. ClaimTypes.NameIdentifier
UserNameClaimType Pobiera lub ustawia typ oświadczenia używany dla oświadczenia nazwy użytkownika. ClaimTypes.Name

Blokady

Blokada jest ustawiona w metodzie 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();
}

Powyższy kod jest oparty na szablonie LoginIdentity .

Opcje blokady są ustawiane w pliku StartUp.ConfigureServices:

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

Powyższy kod ustawia IdentityOptions LockoutOptions wartości domyślne.

Pomyślne uwierzytelnienie resetuje liczbę nieudanych prób dostępu i resetuje zegar.

IdentityOptions.Lockout określa LockoutOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
AllowedForNewUsers Określa, czy nowy użytkownik może zostać zablokowany. true
DefaultLockoutTimeSpan Czas blokowania użytkownika w przypadku wystąpienia blokady. 5 min
MaxFailedAccessAttempts Liczba nieudanych prób dostępu do momentu zablokowania użytkownika, jeśli blokada jest włączona. 5

Hasło

Domyślnie Identity hasła zawierają wielkie litery, małe litery, cyfrę i znak inny niż alfanumeryczny. Hasła muszą mieć długość co najmniej sześciu znaków.

Hasła są konfigurowane przy użyciu:

  • PasswordOptions w pliku Startup.ConfigureServices.
  • [StringLength] atrybuty właściwości, Password jeśli Identity są szkieletowane w aplikacji. InputModelPassword właściwości znajdują się w następujących plikach:
    • 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 określa PasswordOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
RequireDigit Wymaga liczby z zakresu od 0 do 9 w haśle. true
RequiredLength Minimalna długość hasła. 6
RequireLowercase Wymaga małego znaku w haśle. true
RequireNonAlphanumeric Wymaga znaku innego niż alfanumeryczne w haśle. true
RequiredUniqueChars Dotyczy tylko ASP.NET Core 2.0 lub nowszej.

Wymaga liczby odrębnych znaków w haśle.
1
RequireUppercase Wymaga wielkich liter w haśle. true

Logowanie

Poniższy kod ustawia SignIn ustawienia (do wartości domyślnych):

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

IdentityOptions.SignIn określa SignInOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
RequireConfirmedEmail Wymaga potwierdzonej wiadomości e-mail w celu zalogowania się. false
RequireConfirmedPhoneNumber Wymaga potwierdzonego numeru telefonu do zalogowania się. false

Tokeny

IdentityOptions.Tokens określa TokenOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis
AuthenticatorTokenProvider Pobiera lub ustawia AuthenticatorTokenProvider używane do weryfikowania logowania dwuskładnikowego przy użyciu wystawcy uwierzytelniającego.
ChangeEmailTokenProvider Pobiera lub ustawia ChangeEmailTokenProvider używane do generowania tokenów używanych w wiadomościach e-mail z potwierdzeniem zmiany wiadomości e-mail.
ChangePhoneNumberTokenProvider Pobiera lub ustawia ChangePhoneNumberTokenProvider używane do generowania tokenów używanych podczas zmieniania numerów telefonów.
EmailConfirmationTokenProvider Pobiera lub ustawia dostawcę tokenu używanego do generowania tokenów używanych w wiadomościach e-mail z potwierdzeniem konta.
PasswordResetTokenProvider Pobiera lub ustawia IUserTwoFactorTokenProvider<TUser> używane do generowania tokenów używanych w wiadomościach e-mail resetowania haseł.
ProviderMap Służy do konstruowania dostawcy tokenów użytkownika z kluczem używanym jako nazwa dostawcy.

User

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

});

IdentityOptions.User określa UserOptions właściwość z właściwościami wyświetlanymi w tabeli.

Właściwości opis Wartość domyślna
AllowedUserNameCharacters Dozwolone znaki w nazwie użytkownika. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Wymaga, aby każdy użytkownik miał unikatową wiadomość e-mail. false

Skonfiguruj aplikację cookie w programie Startup.ConfigureServices. Polecenie ConfigureApplicationCookie musi być wywoływane po wywołaniu metody AddIdentity lub 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;
});

Aby uzyskać więcej informacji, zobacz CookieAuthenticationOptions.

Opcje skrótów haseł

PasswordHasherOptions pobiera i ustawia opcje tworzenia skrótów haseł.

Opcja Opis
CompatibilityMode Tryb zgodności używany podczas tworzenia skrótów nowych haseł. Wartość domyślna to IdentityV3. Pierwszy bajt skrótu hasła, nazywany znacznikiem formatu, określa wersję algorytmu wyznaczania wartości skrótu używanej do wyznaczania wartości skrótu hasła. Podczas weryfikowania hasła względem skrótu VerifyHashedPassword metoda wybiera prawidłowy algorytm na podstawie pierwszego bajtu. Klient może uwierzytelnić się niezależnie od wersji algorytmu użytej do utworzenia skrótu hasła. Ustawienie trybu zgodności wpływa na tworzenie skrótów nowych haseł.
IterationCount Liczba iteracji używanych podczas tworzenia skrótów haseł przy użyciu pliku PBKDF2. Ta wartość jest używana tylko wtedy, gdy CompatibilityMode parametr ma wartość IdentityV3. Wartość musi być dodatnią liczbą całkowitą i wartością domyślną .10000

W poniższym przykładzie parametr IterationCount jest ustawiony na 12000 wartość w Startup.ConfigureServicespliku :

// using Microsoft.AspNetCore.Identity;

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

Globalnie wymaga uwierzytelnienia wszystkich użytkowników

Aby uzyskać informacje na temat globalnego wymagania uwierzytelnienia wszystkich użytkowników, zobacz Wymaganie uwierzytelnionych użytkowników.