Autorização e Autenticação em C# (.NET): Guia Completo
A segurança de aplicações web é a pedra angular do desenvolvimento moderno. No ecossistema C# (.NET), os mecanismos integrados de autenticação e autorização permitem proteger sua aplicação de forma flexível e confiável. Neste artigo, abordaremos os conceitos-chave, ferramentas e exemplos de código para trabalhar com Identity, JWT e modelo de funções.
1. Conceitos Básicos
Antes de passarmos ao código, é importante diferenciar dois termos:
- Autenticação — processo de verificação da identidade do usuário (quem é você?). Geralmente é feita através de login/senha, tokens ou provedores externos.
- Autorização — processo de definição de direitos de acesso (o que você pode fazer?). É implementada através de funções, políticas ou claims.
2. ASP.NET Core Identity — Solução Integrada
Microsoft.AspNetCore.Identity é um sistema completo de gerenciamento de usuários que inclui registro, login, redefinição de senha, autenticação de dois fatores e muito mais. Ele funciona com Entity Framework Core e suporta qualquer armazenamento de dados.
Instalação:
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCoredotnet add package Microsoft.EntityFrameworkCore.SqlServerExemplo de registro de usuário (controller Account):
public class AccountController : Controller{ private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager) { _userManager = userManager; _signInManager = signInManager; }
[HttpPost] public async Task<IActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new IdentityUser { UserName = model.Email, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { await _signInManager.SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } foreach (var error in result.Errors) ModelState.AddModelError(string.Empty, error.Description); } return View(model); }}3. JWT (JSON Web Tokens) — Autenticação sem Estado
Para SPAs modernos (React, Angular) ou aplicativos móveis, o JWT é frequentemente utilizado. O token é assinado pelo servidor e contém claims (declarações) sobre o usuário. O servidor não armazena sessões, o que simplifica a escalabilidade.
Configuração em Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidateAudience = true, ValidAudience = builder.Configuration["Jwt:Audience"], ValidateLifetime = true, IssuerSigningKey = new SymmetricSecurityKey( Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"])) }; });Geração do token:
public string GenerateToken(IdentityUser user){ var claims = new[] { new Claim(ClaimTypes.NameIdentifier, user.Id), new Claim(ClaimTypes.Email, user.Email), new Claim(ClaimTypes.Role, "User") };
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
va Também na biblioteca
ts-mockito para TypeScript: guia completo com exemplos
ring para Rust: guia completo com exemplos práticos
GraphQL em C# (.NET): bibliotecas Hot Chocolate e GraphQL.NET para criação de APIs