- Adicionar controle de permissão em todos os Endpoints necessários;
- Criar controle de acesso nivel Admin;
- Adicionar tempo de expiração ao TokenJwt
A autenticação com JWT (JSON Web Token) em ASP.NET Core é feita com a ajuda de pacotes NuGet, como o Microsoft.AspNetCore.Authentication.JwtBearer. Este pacote permite validar tokens JWT e proteger endpoints com base em roles e claims definidos no token.
Para utilizar autenticação token JWT em C# ASP.NET Core, siga os seguintes passos:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
public void ConfigureServices(IServiceCollection services)
{
// Configura autenticação JWT
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "Issuer",
ValidAudience = "Audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecretKey"))
};
});
}
Neste exemplo, a chave secreta é "SecretKey", o emissor do token é "Issuer" e o público-alvo é "Audience".
Configure a autenticação na classe Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Ativa autenticação
app.UseAuthentication();
app.UseAuthorization();
}
Proteja um endpoint com autenticação JWT utilizando o atributo [Authorize]:
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
[Authorize]
public IActionResult Get()
{
// Retorna dados protegidos
}
}
Neste exemplo, o método Get() só pode ser acessado por usuários autenticados.
Gere um token JWT na autenticação do usuário:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
[ApiController]
[Route("[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
if (login == null)
{
return BadRequest("Invalid client request");
}
if (login.Username == "user" && login.Password == "password")
{
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "user"),
new Claim(ClaimTypes.Role, "admin")
};
var tokeOptions = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(5),
signingCredentials: signinCredentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(tokeOptions);
return Ok(new { Token = tokenString });
}
else
{
return Unauthorized();
}
}
}
Neste exemplo, a classe LoginModel é usada para representar as credenciais de login do usuário. Ao fazer login com sucesso, um token JWT é gerado, contendo o nome do usuário e a função "admin" (como um exemplo), com validade de 5 minutos.
As informações issuer, audience, key e outros detalhes de configuração do token são obtidos do arquivo de configuração do aplicativo (appsettings.json):
"Jwt": {
"Issuer": "Issuer",
"Audience": "Audience",
"Key": "SecretKey"
}
Com essas configurações, você já pode utilizar a autenticação JWT em seus endpoints ASP.NET Core. Certifique-se de testar sua implementação adequadamente e ajustar as configurações de segurança conforme necessário para atender às necessidades do seu aplicativo.