Konfigurera ASP.NET Core Identity

ASP.NET Core Identity använder standardvärden för inställningar som lösenordsprincip, utelåsning och cookie konfiguration. De här inställningarna kan åsidosättas vid programstart.

Identity Alternativ

Klassen IdentityOptions representerar de alternativ som kan användas för att konfigurera Identity systemet. IdentityOptions måste anges efter att ha anropat AddIdentity eller AddDefaultIdentity.

Anspråk Identity

IdentityOptions.ClaimsIdentity specificerar ClaimsIdentityOptions med de egenskaper som visas i följande tabell.

Fastighet Description Förinställning
RoleClaimType Hämtar eller anger den anspråkstyp som används för ett rollanspråk. ClaimTypes.Role
SecurityStampClaimType Hämtar eller anger anspråkstypen som används för säkerhetsstämpelanspråket. AspNet.Identity.SecurityStamp
UserIdClaimType Hämtar eller anger anspråkstypen som används för anspråket för användaridentifierare. ClaimTypes.NameIdentifier
UserNameClaimType Hämtar eller anger anspråkstypen som används för användarnamnsanspråket. ClaimTypes.Name

Låsning

Utelåsning anges i metoden 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();
}

Föregående kod baseras på mallenLoginIdentity.

Alternativ för utelåsning anges i 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();

Föregående kod anger IdentityOptionsLockoutOptions med standardvärden.

En lyckad autentisering återställer antalet misslyckade åtkomstförsök och återställer klockan.

IdentityOptions.Lockout anger LockoutOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
AllowedForNewUsers Avgör om en ny användare kan låsas. true
DefaultLockoutTimeSpan Hur lång tid en användare är utelåst när en utelåsning sker. 5 minuter
MaxFailedAccessAttempts Antalet misslyckade åtkomstförsök tills en användare är utelåst, om utelåsning är aktiverat. 5

Lösenord

Som standard Identity kräver att lösenord innehåller versaler, gemener, en siffra och ett icke-alfanumeriskt tecken. Lösenord måste vara minst sex tecken långa.

Lösenord konfigureras med:

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 specificerar PasswordOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
RequireDigit Kräver ett tal mellan 0 och 9 i lösenordet. true
RequiredLength Minsta längd på lösenordet. 6
RequireLowercase Kräver en gemen bokstav i lösenordet. true
RequireNonAlphanumeric Kräver ett icke-alfanumeriskt tecken i lösenordet. true
RequiredUniqueChars Gäller endast för ASP.NET Core 2.0 eller senare.

Kräver antalet distinkta tecken i lösenordet.
1
RequireUppercase Kräver en stor bokstav i lösenordet. true

Logga in

Följande kod anger SignIn inställningar (till standardvärden):

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

IdentityOptions.SignIn anger SignInOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
RequireConfirmedEmail Kräver ett bekräftat e-postmeddelande för att logga in. false
RequireConfirmedPhoneNumber Kräver ett bekräftat telefonnummer för att logga in. false

Tokener

IdentityOptions.Tokens anger TokenOptions med de egenskaper som visas i tabellen.

Fastighet Description
AuthenticatorTokenProvider Hämtar eller anger den AuthenticatorTokenProvider som används för att verifiera tvåfaktorsautentiseringar med en autentiserare.
ChangeEmailTokenProvider Hämtar eller anger den ChangeEmailTokenProvider som används för att generera tokens som används i e-poständringsbekräftelsemeddelanden.
ChangePhoneNumberTokenProvider Hämtar eller anger den ChangePhoneNumberTokenProvider som används för att generera token som används vid ändring av telefonnummer.
EmailConfirmationTokenProvider Hämtar eller anger den tokenprovider som används för att generera token som används i e-postmeddelanden för kontobekräftelse.
PasswordResetTokenProvider Hämtar eller anger den IUserTwoFactorTokenProvider<TUser> som används för att generera tokens som används i e-postmeddelanden för återställning av lösenord.
ProviderMap Används för att konstruera en Användartoken Provider med nyckeln som används som providerns namn.

User

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

});

IdentityOptions.User specificerar UserOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
AllowedUserNameCharacters Tillåtna tecken i användarnamnet. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Kräver att varje användare har ett unikt e-postmeddelande. false

Konfigurera appens cookie i Program.cs. ConfigureApplicationCookie måste anropas efter att ha anropat AddIdentity eller 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;
});

Mer information finns i CookieAuthenticationOptions.

Alternativ för lösenordshash-funktion

PasswordHasherOptions hämtar och anger alternativ för hashning av lösenord.

Option Description
CompatibilityMode Kompatibilitetsläget som används vid hashning av nya lösenord. Standardinställningen är IdentityV3. Den första byten av ett hashat lösenord, kallat en formatmarkör, anger versionen av hashalgoritmen som används för att hashat lösenordet. När du verifierar ett lösenord mot en hash VerifyHashedPassword väljer metoden rätt algoritm baserat på den första byteen. En klient kan autentisera oavsett vilken version av algoritmen som användes för att hash-lösenordet. Om du ställer in kompatibilitetsläget påverkas hasheringen av nya lösenord.
IterationCount Antalet iterationer som används vid hashning av lösenord med PBKDF2. Det här värdet används bara när CompatibilityMode är inställt på IdentityV3. Värdet måste vara ett positivt heltal och standardvärdet är 100000.

I följande exempel anges IterationCount till 12000 i Program.cs:

// using Microsoft.AspNetCore.Identity;

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

Globalt kräver alla användare att autentiseras

Information om hur du globalt kräver att alla användare autentiseras finns i Kräv autentiserade användare.

ISecurityStampValidator och SignOut överallt

Appar måste reagera på händelser som involverar säkerhetskänsliga åtgärder genom att återskapa användarna ClaimsPrincipal. Till exempel ClaimsPrincipal bör återskapas när du ansluter en roll, ändrar lösenordet eller andra säkerhetskänsliga händelser. Identity använder ISecurityStampValidator-gränssnittet för att återskapa ClaimsPrincipal. Standardimplementeringen av Identity registrerar en SecurityStampValidator med huvudprogrammet för cookie och tvåfaktorsautentiseringen cookie. Validatorn ansluter till händelsen OnValidatePrincipal för varje cookie, där den anropar Identity för att verifiera att säkerhetsstämpeln i användarens anspråk är oförändrad från det som lagras i cookie. Validatorn anropar med jämna mellanrum. Samtalsintervallet är en kompromiss mellan att anropa datalagret för ofta och för sällan. Kontroll över ett långt intervall resulterar i inaktuella påståenden. Anropa userManager.UpdateSecurityStampAsync(user)för att tvinga befintliga cookies att ogiltigförklaras nästa gång de kontrolleras. De flesta Identity UI-kontohanteringssidorna anropar userManager.UpdateSecurityStampAsync(user) efter att lösenordet har ändrats eller en inloggning har lagts till. Appar kan anropa userManager.UpdateSecurityStampAsync(user) för att implementera en utloggningsåtgärd överallt.

Om du ändrar valideringsintervallet visas följande markerade kod:

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 använder standardvärden för inställningar som lösenordsprincip, utelåsning och cookie konfiguration. De här inställningarna kan åsidosättas i Startup klassen.

Identity Alternativ

Klassen IdentityOptions representerar de alternativ som kan användas för att konfigurera Identity systemet. IdentityOptions måste anges efter att ha anropat AddIdentity eller AddDefaultIdentity.

Anspråk Identity

IdentityOptions.ClaimsIdentity anger ClaimsIdentityOptions med de egenskaper som visas i följande tabell.

Fastighet Description Förinställning
RoleClaimType Hämtar eller anger den anspråkstyp som används för ett rollanspråk. ClaimTypes.Role
SecurityStampClaimType Hämtar eller anger anspråkstypen som används för säkerhetsstämpelanspråket. AspNet.Identity.SecurityStamp
UserIdClaimType Hämtar eller anger anspråkstypen som används för anspråket för användaridentifierare. ClaimTypes.NameIdentifier
UserNameClaimType Hämtar eller anger anspråkstypen som används för användarnamnsanspråket. ClaimTypes.Name

Låsning

Utelåsning anges i metoden 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();
}

Föregående kod baseras på mallen LoginIdentity .

Alternativ för utelåsning anges i StartUp.ConfigureServices:

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

Föregående kod anger IdentityOptionsLockoutOptions med standardvärden.

En lyckad autentisering återställer antalet misslyckade åtkomstförsök och återställer klockan.

IdentityOptions.Lockout specificerar LockoutOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
AllowedForNewUsers Avgör om en ny användare kan låsas. true
DefaultLockoutTimeSpan Hur lång tid en användare är utelåst när en utelåsning sker. 5 minuter
MaxFailedAccessAttempts Antalet misslyckade åtkomstförsök tills en användare är utelåst, om utelåsning är aktiverat. 5

Lösenord

Som standard Identity kräver att lösenord innehåller versaler, gemener, en siffra och ett icke-alfanumeriskt tecken. Lösenord måste vara minst sex tecken långa.

Lösenord konfigureras med:

  • PasswordOptions i Startup.ConfigureServices.
  • [StringLength] attribut för Password egenskaper om Identity är genererade i appen. InputModel Password egenskaper finns i följande filer:
    • 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 specificerar PasswordOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
RequireDigit Kräver ett tal mellan 0 och 9 i lösenordet. true
RequiredLength Minsta längd på lösenordet. 6
RequireLowercase Kräver en liten bokstav i lösenordet. true
RequireNonAlphanumeric Kräver ett icke-alfanumeriskt tecken i lösenordet. true
RequiredUniqueChars Gäller endast för ASP.NET Core 2.0 eller senare.

Kräver antalet distinkta tecken i lösenordet.
1
RequireUppercase Kräver en stor bokstav i lösenordet. true

Logga in

Följande kod anger SignIn inställningar (till standardvärden):

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

IdentityOptions.SignIn specificerar SignInOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
RequireConfirmedEmail Kräver ett bekräftat e-postmeddelande för att logga in. false
RequireConfirmedPhoneNumber Kräver ett bekräftat telefonnummer för att logga in. false

Tokener

IdentityOptions.Tokens anger TokenOptions med de egenskaper som visas i tabellen.

Fastighet Description
AuthenticatorTokenProvider Hämtar eller anger den AuthenticatorTokenProvider som används för att verifiera tvåfaktorsautentiseringar med en autentiserare.
ChangeEmailTokenProvider Hämtar eller anger den ChangeEmailTokenProvider som används för att generera tokenen som används i e-poständringsbekräftelsemeddelanden.
ChangePhoneNumberTokenProvider Hämtar eller anger den ChangePhoneNumberTokenProvider som används för att generera tokens som används när telefonnummer ändras.
EmailConfirmationTokenProvider Hämtar eller anger den tokenprovider som används för att generera token som används i e-postmeddelanden för kontobekräftelse.
PasswordResetTokenProvider Hämtar eller anger den IUserTwoFactorTokenProvider<TUser> som används för att generera tokens som används i e-postmeddelanden för lösenordsåterställning.
ProviderMap Används för att konstruera en Användartokenleverantör där nyckeln används som leverantörens namn.

User

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

});

IdentityOptions.User specificerar UserOptions med de egenskaper som visas i tabellen.

Fastighet Description Förinställning
AllowedUserNameCharacters Tillåtna tecken i användarnamnet. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Kräver att varje användare har ett unikt e-postmeddelande. false

Konfigurera appens cookie i Startup.ConfigureServices. ConfigureApplicationCookie måste anropas efter att ha anropat AddIdentity eller 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;
});

Mer information finns i CookieAuthenticationOptions.

Alternativ för Password Hasher

PasswordHasherOptions hämtar och anger alternativ för hashning av lösenord.

Option Description
CompatibilityMode Kompatibilitetsläget som används vid hashning av nya lösenord. Standardinställningen är IdentityV3. Den första byten av ett hasherat lösenord, som kallas en formatmarkör, anger den version av hashalgoritmen som används för att hasha lösenordet. När du verifierar ett lösenord mot en hash VerifyHashedPassword väljer metoden rätt algoritm baserat på den första byteen. En klient kan autentisera oavsett vilken version av algoritmen som användes för att hash-lösenordet. Om du ställer in kompatibilitetsläget påverkas hasheringen av nya lösenord.
IterationCount Antalet iterationer som används vid hashning av lösenord med PBKDF2. Det här värdet används bara när CompatibilityMode är inställt på IdentityV3. Värdet måste vara ett positivt heltal och standardvärdet är 10000.

I följande exempel är IterationCount inställt på 12000 i Startup.ConfigureServices:

// using Microsoft.AspNetCore.Identity;

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

Globalt kräver alla användare att autentiseras

Information om hur du globalt kräver att alla användare autentiseras finns i Kräv autentiserade användare.