Partilhar via


Configurar ASP.NET Core Identity

ASP.NET Core Identity utiliza valores predefinidos para definições como política de palavras-passe, bloqueio e cookie configuração. Estas definições podem ser ultrapassadas no arranque da aplicação.

Identity Opções

A IdentityOptions classe representa as opções que podem ser usadas para configurar o Identity sistema. IdentityOptions deve ser definido depois de chamar AddIdentity ou AddDefaultIdentity.

Reivindicações Identity

IdentityOptions.ClaimsIdentity especifica o ClaimsIdentityOptions com as propriedades apresentadas na tabela seguinte.

Propriedade Description Predefinido
RoleClaimType Obtém ou define o tipo de reivindicação usado para uma reivindicação de função. ClaimTypes.Role
SecurityStampClaimType Obtém ou define o tipo de reclamação usado para a reclamação do selo de segurança. AspNet.Identity.SecurityStamp
UserIdClaimType Obtém ou define o tipo de declaração usado para a declaração do identificador do utilizador. ClaimTypes.NameIdentifier
UserNameClaimType Obtém ou define o tipo de declaração usado para a declaração de nome de utilizador. ClaimTypes.Name

Bloqueio

O bloqueio é definido no método PasswordLogInAsync :

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

O código anterior baseia-se no LoginIdentity modelo.

As opções de bloqueio estão definidas em 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();

O código anterior define os IdentityOptionsLockoutOptions com valores padrão.

Uma autenticação bem-sucedida redefine a contagem de tentativas de acesso com falha e redefine o relógio.

IdentityOptions.Lockout especifica o LockoutOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
AllowedForNewUsers Determina se um novo utilizador pode ser bloqueado. true
DefaultLockoutTimeSpan O tempo que um utilizador fica bloqueado quando ocorre um bloqueio. 5 minutos
MaxFailedAccessAttempts O número de tentativas de acesso falhadas até um utilizador ficar bloqueado, se o bloqueio estiver ativado. 5

Palavra-passe

Por defeito, Identity exige que as palavras-passe contenham um carácter maiúsculo, um caractere minúsculo, um dígito e um carácter não alfanumérico. As palavras-passe devem ter pelo menos seis caracteres.

As palavras-passe são configuradas com:

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 especifica o PasswordOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
RequireDigit Requer um número entre 0 e 9 na palavra-passe. true
RequiredLength O comprimento mínimo da palavra-passe. 6
RequireLowercase Requer um carácter minúsculo na palavra-passe. true
RequireNonAlphanumeric Requer um carácter não alfanumérico na palavra-passe. true
RequiredUniqueChars Aplica-se apenas a ASP.NET Core 2.0 ou posterior.

Requer o número de caracteres distintos na palavra-passe.
1
RequireUppercase Requer uma letra maiúscula na palavra-passe. true

Iniciar sessão

O código seguinte define SignIn as definições (para valores padrão):

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

IdentityOptions.SignIn especifica o SignInOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
RequireConfirmedEmail É necessário um email confirmado para iniciar sessão. false
RequireConfirmedPhoneNumber É necessário um número de telefone confirmado para iniciar sessão. false

Tokens

IdentityOptions.Tokens especifica o TokenOptions com as propriedades apresentadas na tabela.

Propriedade Description
AuthenticatorTokenProvider Obtém ou define o AuthenticatorTokenProvider usado para validar iniciações de sessão em dois fatores com um autenticador.
ChangeEmailTokenProvider Obtém ou define o ChangeEmailTokenProvider utilizado na geração de tokens para emails de confirmação de mudança de email.
ChangePhoneNumberTokenProvider Obtém ou define o ChangePhoneNumberTokenProvider que é usado para gerar tokens usados ao mudar de número de telefone.
EmailConfirmationTokenProvider Obtém ou define o fornecedor de tokens usado para gerar tokens usados nos emails de confirmação da conta.
PasswordResetTokenProvider Obtém ou define o IUserTwoFactorTokenProvider<TUser> usado para gerar tokens utilizados em emails de redefinição de palavra-passe.
ProviderMap Usado para construir um User Token Provider com a chave usada como nome do fornecedor.

User

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

});

IdentityOptions.User especifica o UserOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
AllowedUserNameCharacters Caracteres permitidos no nome de utilizador. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Exige que cada utilizador tenha um email único. false

Configure a aplicação cookie em Program.cs. ConfigureApplicationCookie deve ser chamado após chamar AddIdentity ou 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;
});

Para obter mais informações, consulte CookieAuthenticationOptions.

Opções do hasher de palavras-passe

PasswordHasherOptions obtém e define opções para hash de senhas.

Opção Description
CompatibilityMode O modo de compatibilidade usado ao fazer hash de novas palavras-passe. O padrão é IdentityV3. O primeiro byte de uma palavra-passe com hash, chamado marcador de formato, especifica a versão do algoritmo de hash usada para fazer o hash da palavra-passe. Ao verificar uma palavra-passe contra um hash, o VerifyHashedPassword método seleciona o algoritmo correto com base no primeiro byte. Um cliente consegue autenticar-se independentemente da versão do algoritmo usada para fazer o hash da palavra-passe. Definir o modo de compatibilidade afeta o hash das novas palavras-passe.
IterationCount O número de iterações usadas ao fazer hash de palavras-passe usando PBKDF2. Este valor só é usado quando o CompatibilityMode é definido como IdentityV3. O valor deve ser um inteiro positivo e o padrão é 100000.

No exemplo seguinte, o IterationCount é definido como 12000 em Program.cs:

// using Microsoft.AspNetCore.Identity;

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

A nível global, exigem que todos os utilizadores sejam autenticados

Para obter informações sobre como exigir globalmente que todos os usuários sejam autenticados, consulte Exigir usuários autenticados.

ISecurityStampValidator e Encerrar sessão em todos os lugares

As aplicações precisam de reagir a eventos envolvendo ações sensíveis à segurança regenerando os utilizadores ClaimsPrincipal. Por exemplo, o ClaimsPrincipal deve ser regenerado ao assumir uma função, mudar a palavra-passe ou durante outros eventos críticos para a segurança. Identity usa a ISecurityStampValidator interface para regenerar o ClaimsPrincipal. A implementação padrão de Identity regista um SecurityStampValidator com a aplicação cookie principal e a autenticação de dois fatores cookie. O validador integra-se no evento OnValidatePrincipal de cada cookie para chamar o Identity e verificar se a afirmação de carimbo de segurança do utilizador está inalterada em comparação com o que está guardado no cookie. O validador verifica a intervalos regulares. O intervalo de chamada é um compromisso entre aceder ao banco de dados com demasiada frequência ou não com frequência suficiente. Verificar com um longo intervalo resulta em afirmações obsoletas. Chame userManager.UpdateSecurityStampAsync(user) para forçar os cookies existentes a serem tornados inválidos na próxima vez que forem verificados. A maioria das contas na interface do utilizador e das páginas de gestão de conta chamam userManager.UpdateSecurityStampAsync(user) depois de mudar a palavra-passe ou adicionar um login. As aplicações podem chamar userManager.UpdateSecurityStampAsync(user) para implementar uma ação de desconexão em todos os lugares.

A alteração do intervalo de validação é mostrada no seguinte código destacado:

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 utiliza valores predefinidos para definições como política de palavras-passe, bloqueio e cookie configuração. Estas definições podem ser substituídas na Startup classe.

Identity Opções

A IdentityOptions classe representa as opções que podem ser usadas para configurar o Identity sistema. IdentityOptions deve ser definido depois de chamar AddIdentity ou AddDefaultIdentity.

Reivindicações Identity

IdentityOptions.ClaimsIdentity especifica o ClaimsIdentityOptions com as propriedades apresentadas na tabela seguinte.

Propriedade Description Predefinido
RoleClaimType Obtém ou define o tipo de reivindicação usado para uma reivindicação de função. ClaimTypes.Role
SecurityStampClaimType Obtém ou define o tipo de reclamação usado para a reclamação do selo de segurança. AspNet.Identity.SecurityStamp
UserIdClaimType Obtém ou define o tipo de declaração usado para a declaração do identificador do utilizador. ClaimTypes.NameIdentifier
UserNameClaimType Obtém ou define o tipo de declaração usado para a declaração de nome de utilizador. ClaimTypes.Name

Bloqueio

O bloqueio é definido no método PasswordLogInAsync :

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

O código anterior baseia-se no LoginIdentity modelo.

As opções de bloqueio estão definidas em StartUp.ConfigureServices:

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

O código anterior define os IdentityOptionsLockoutOptions com valores padrão.

Uma autenticação bem-sucedida redefine a contagem de tentativas de acesso com falha e redefine o relógio.

IdentityOptions.Lockout especifica o LockoutOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
AllowedForNewUsers Determina se um novo utilizador pode ser bloqueado. true
DefaultLockoutTimeSpan O tempo que um utilizador fica bloqueado quando ocorre um bloqueio. 5 minutos
MaxFailedAccessAttempts O número de tentativas de acesso falhadas até um utilizador ficar bloqueado, se o bloqueio estiver ativado. 5

Palavra-passe

Por defeito, Identity exige que as palavras-passe contenham um carácter maiúsculo, um caractere minúsculo, um dígito e um carácter não alfanumérico. As palavras-passe devem ter pelo menos seis caracteres.

As palavras-passe são configuradas com:

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 especifica o PasswordOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
RequireDigit Requer um número entre 0 e 9 na palavra-passe. true
RequiredLength O comprimento mínimo da palavra-passe. 6
RequireLowercase Requer um carácter minúsculo na palavra-passe. true
RequireNonAlphanumeric Requer um carácter não alfanumérico na palavra-passe. true
RequiredUniqueChars Aplica-se apenas a ASP.NET Core 2.0 ou posterior.

Requer o número de caracteres distintos na palavra-passe.
1
RequireUppercase Requer uma letra maiúscula na palavra-passe. true

Iniciar sessão

O código seguinte define SignIn as definições (para valores padrão):

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

IdentityOptions.SignIn especifica o SignInOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
RequireConfirmedEmail É necessário um email confirmado para iniciar sessão. false
RequireConfirmedPhoneNumber É necessário um número de telefone confirmado para iniciar sessão. false

Tokens

IdentityOptions.Tokens especifica o TokenOptions com as propriedades apresentadas na tabela.

Propriedade Description
AuthenticatorTokenProvider Obtém ou define o AuthenticatorTokenProvider usado para validar iniciações de sessão em dois fatores com um autenticador.
ChangeEmailTokenProvider Obtém ou define o ChangeEmailTokenProvider utilizado na geração de tokens para emails de confirmação de mudança de email.
ChangePhoneNumberTokenProvider Obtém ou define o ChangePhoneNumberTokenProvider que é usado para gerar tokens usados ao mudar de número de telefone.
EmailConfirmationTokenProvider Obtém ou define o fornecedor de tokens usado para gerar tokens usados nos emails de confirmação da conta.
PasswordResetTokenProvider Obtém ou define o IUserTwoFactorTokenProvider<TUser> usado para gerar tokens utilizados em emails de redefinição de palavra-passe.
ProviderMap Usado para construir um User Token Provider com a chave usada como nome do fornecedor.

User

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

});

IdentityOptions.User especifica o UserOptions com as propriedades apresentadas na tabela.

Propriedade Description Predefinido
AllowedUserNameCharacters Caracteres permitidos no nome de utilizador. abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
-._@+
RequireUniqueEmail Exige que cada utilizador tenha um email único. false

Configure a aplicação cookie em Startup.ConfigureServices. ConfigureApplicationCookie deve ser chamado após chamar AddIdentity ou 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;
});

Para obter mais informações, consulte CookieAuthenticationOptions.

Opções do hasher de palavras-passe

PasswordHasherOptions obtém e define opções para hash de senhas.

Opção Description
CompatibilityMode O modo de compatibilidade usado ao fazer hash de novas palavras-passe. O padrão é IdentityV3. O primeiro byte de uma palavra-passe com hash, chamado marcador de formato, especifica a versão do algoritmo de hash usada para fazer o hash da palavra-passe. Ao verificar uma palavra-passe contra um hash, o VerifyHashedPassword método seleciona o algoritmo correto com base no primeiro byte. Um cliente consegue autenticar-se independentemente da versão do algoritmo usada para fazer o hash da palavra-passe. Definir o modo de compatibilidade afeta o hash das novas palavras-passe.
IterationCount O número de iterações usadas ao fazer hash de palavras-passe usando PBKDF2. Este valor só é usado quando o CompatibilityMode é definido como IdentityV3. O valor deve ser um inteiro positivo e o padrão é 10000.

No exemplo seguinte, o IterationCount é definido como 12000 em Startup.ConfigureServices:

// using Microsoft.AspNetCore.Identity;

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

A nível global, exigem que todos os utilizadores sejam autenticados

Para obter informações sobre como exigir globalmente que todos os usuários sejam autenticados, consulte Exigir usuários autenticados.