Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Políticas de autorização personalizadas com
Use a IAuthorizationRequirementData interface para especificar os requisitos associados à política de autorização em definições de atributo.
Aplicativo de exemplo
O exemplo completo descrito neste artigo é o aplicativo de exemplo AuthRequirementsData (dotnet/AspNetCore.Docs.Samples repositório GitHub) (como baixar). O aplicativo de exemplo implementa um manipulador de idade mínima para os usuários, exigindo que um usuário apresente uma declaração de data de nascimento indicando que eles têm pelo menos 21 anos.
Atributo de idade mínima autorizada
A implementação de MinimumAgeAuthorizeAttribute de IAuthorizationRequirementData define uma idade de autorização.
using Microsoft.AspNetCore.Authorization;
namespace AuthRequirementsData.Authorization;
class MinimumAgeAuthorizeAttribute(int age) : AuthorizeAttribute,
IAuthorizationRequirement, IAuthorizationRequirementData
{
public int Age { get; set; } = age;
public IEnumerable<IAuthorizationRequirement> GetRequirements()
{
yield return this;
}
}
Manipulador de autorização de idade mínima
A MinimumAgeAuthorizationHandler classe manipula o único IAuthorizationRequirement fornecido por MinimumAgeAuthorizeAttribute, conforme especificado pelo parâmetro MinimumAgeAuthorizeAttributegenérico.
O método HandleRequirementAsync:
- Obtém a declaração de data de nascimento do usuário.
- Obtém a idade do usuário da declaração.
- Ajusta a idade se o usuário não fez aniversário este ano.
- Marca o requisito de autorização bem-sucedido se o usuário atender ao requisito de idade.
- Implementa o registro em log para fins de demonstração.
using System.Globalization;
using System.Security.Claims;
using Microsoft.AspNetCore.Authorization;
namespace AuthRequirementsData.Authorization;
class MinimumAgeAuthorizationHandler(ILogger<MinimumAgeAuthorizationHandler> logger)
: AuthorizationHandler<MinimumAgeAuthorizeAttribute>
{
// Check whether a given minimum age requirement is satisfied.
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeAuthorizeAttribute requirement)
{
logger.LogInformation(
"Evaluating authorization requirement for age >= {age}",
requirement.Age);
// Get the user's birth date claim.
var dateOfBirthClaim =
context.User.FindFirst(c => c.Type == ClaimTypes.DateOfBirth);
if (dateOfBirthClaim != null)
{
// If the user has a date of birth claim, obtain their age.
var dateOfBirth = Convert.ToDateTime(dateOfBirthClaim.Value,
CultureInfo.InvariantCulture);
var age = DateTime.Now.Year - dateOfBirth.Year;
// Adjust age if the user hasn't had a birthday yet this year.
if (dateOfBirth > DateTime.Now.AddYears(-age))
{
age--;
}
// If the user meets the age requirement, mark the authorization
// requirement succeeded.
if (age >= requirement.Age)
{
logger.LogInformation(
"Minimum age authorization requirement {age} satisfied",
requirement.Age);
context.Succeed(requirement);
}
else
{
logger.LogInformation(
"Current user's DateOfBirth claim ({dateOfBirth}) doesn't " +
"satisfy the minimum age authorization requirement {age}",
dateOfBirthClaim.Value,
requirement.Age);
}
}
else
{
logger.LogInformation("No DateOfBirth claim present");
}
return Task.CompletedTask;
}
}
O MinimumAgeAuthorizationHandler é registrado como um serviço singleton IAuthorizationHandler no arquivo Program do aplicativo.
builder.Services.AddSingleton<IAuthorizationHandler,
MinimumAgeAuthorizationHandler>();
O GreetingsController exibe o nome do usuário quando ele atende à política de idade mínima, usando o atributo [MinimumAgeAuthorize({AGE})] com a idade de 21 anos, em que o marcador de posição {AGE} é a idade.
using Microsoft.AspNetCore.Mvc;
using AuthRequirementsData.Authorization;
namespace AuthRequirementsData.Controllers;
[ApiController]
[Route("api/[controller]")]
public class GreetingsController : Controller
{
[MinimumAgeAuthorize(21)]
[HttpGet("hello")]
public string Hello() =>
$"Hello {HttpContext.User.Identity?.Name}!";
}
Se a declaração de data de nascimento do usuário indicar que ele tem pelo menos 21 anos, o controlador exibirá a cadeia de caracteres de saudação, emitindo um código de status 200 (OK). Se o usuário não tiver a declaração de data de nascimento ou a declaração indicar que ele não tem pelo menos 21 anos, a saudação não será exibida e um código de status 403 (Proibido) será emitido.
Os serviços de autenticação do portador JWT são adicionados no arquivo Program do aplicativo:
builder.Services.AddAuthentication().AddJwtBearer();
O arquivo de configurações do aplicativo (appsettings.json) configura o público-alvo e o emissor para a autenticação do portador JWT:
"Authentication": {
"Schemes": {
"Bearer": {
"ValidAudiences": [
"https://localhost:51100"
],
"ValidIssuer": "dotnet-user-jwts"
}
}
}
No exemplo anterior, o público localhost corresponde ao endereço localhost especificado no applicationUrl perfil de inicialização do aplicativo (Properties/launchSettings.json).
Demonstração
Teste o exemplo com dotnet user-jwts e o comando curl.
Na pasta do projeto em um shell de comando, execute o seguinte comando para criar um token de portador JWT com uma declaração de data de nascimento que faz com que o usuário tenha mais de 21 anos:
dotnet user-jwts create --claim http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth=1989-01-01
O resultado produz um token após "Token:" no console de comando.
New JWT saved with ID '{JWT ID}'.
Name: {USER}
Custom Claims: [http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth=1989-01-01]
Token: {TOKEN}
Defina o valor do token (onde o marcador {TOKEN} aparece na saída anterior) para uso posterior.
Você pode decodificar o token em um decodificador JWT online, como jwt.ms para ver seu conteúdo, revelando que ele contém um claim birthdate com a data de nascimento do usuário:
{
"alg": "HS256",
"typ": "JWT"
}.{
"unique_name": "{USER}",
"sub": "{USER}",
"jti": "{JWT ID}",
"birthdate": "1989-01-01",
"aud": [
"https://localhost:51100",
"http://localhost:51101"
],
"nbf": 1747315312,
"exp": 1755264112,
"iat": 1747315313,
"iss": "dotnet-user-jwts"
}.[Signature]
Execute o comando novamente com um dateofbirth valor que torna o usuário com menos de 21 anos:
dotnet user-jwts create --claim http://schemas.xmlsoap.org/ws/2005/05/identity/claims/dateofbirth=2020-01-01
Defina o valor do segundo token à parte.
Inicie o aplicativo no Visual Studio ou com o dotnet watch comando na CLI do .NET.
Na CLI do .NET, execute o seguinte comando curl.exe para solicitar o endpoint api/greetings/hello. Substitua o {TOKEN} placeholder pelo primeiro token de portador JWT que você salvou anteriormente.
curl.exe -i -H "Authorization: Bearer {TOKEN}" https://localhost:51100/api/greetings/hello
A saída indica êxito porque a declaração de data de nascimento do usuário indica que ele tem pelo menos 21 anos:
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Thu, 15 May 2025 22:58:10 GMT
Server: Kestrel
Transfer-Encoding: chunked
Hello {USER}!
O registro em log indica que o requisito de idade foi atendido:
MinimumAgeAuthorizationHandler: Information: Evaluating authorization requirement for age >= 21
MinimumAgeAuthorizationHandler: Information: Minimum age authorization requirement 21 satisfied
Execute novamente o curl.exe comando com o segundo token, que indica que o usuário tem menos de 21 anos. A saída indica que o requisito não é atendido. O acesso ao ponto de extremidade é proibido (código de status 403):
HTTP/1.1 403 Forbidden
Content-Length: 0
Date: Thu, 15 May 2025 22:58:36 GMT
Server: Kestrel
MinimumAgeAuthorizationHandler: Information: Evaluating authorization requirement for age >= 21
MinimumAgeAuthorizationHandler: Information: Current user's DateOfBirth claim (2020-01-01) doesn't satisfy the minimum age authorization requirement 21