Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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:
-
PasswordOptions em
Program.cs. -
[StringLength]atributos dasPasswordpropriedades se Identity for gerado automaticamente na aplicação.InputModelPasswordAs propriedades encontram-se nos seguintes ficheiros:Areas/Identity/Pages/Account/Register.cshtml.csAreas/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.
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 |
Cookie configurações
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:
-
PasswordOptions em
Startup.ConfigureServices. -
[StringLength]atributos dasPasswordpropriedades se Identity for gerado automaticamente na aplicação.InputModelPasswordAs propriedades encontram-se nos seguintes ficheiros:Areas/Identity/Pages/Account/Register.cshtml.csAreas/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 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 |
Cookie configurações
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.