Nosabit.Jwt
1.2.6
dotnet add package Nosabit.Jwt --version 1.2.6
NuGet\Install-Package Nosabit.Jwt -Version 1.2.6
<PackageReference Include="Nosabit.Jwt" Version="1.2.6" />
<PackageVersion Include="Nosabit.Jwt" Version="1.2.6" />
<PackageReference Include="Nosabit.Jwt" />
paket add Nosabit.Jwt --version 1.2.6
#r "nuget: Nosabit.Jwt, 1.2.6"
#addin nuget:?package=Nosabit.Jwt&version=1.2.6
#tool nuget:?package=Nosabit.Jwt&version=1.2.6
Nosabit.Jwt
Una biblioteca de autenticación JWT para .NET 9 con soporte para refresh tokens.
Características
- ✅ Generación y validación de tokens JWT
- ✅ Soporte para refresh tokens
- ✅ Validación de IP opcional para mayor seguridad (desactivada por defecto)
- ✅ Fácil integración en aplicaciones .NET 9 mediante extensiones
- ✅ Soporte para diferentes formatos de autorización (con/sin prefijo "Bearer")
- ✅ Configuración flexible a través de appsettings.json
- ✅ Middleware personalizado para validaciones automáticas
Instalación
dotnet add package Nosabit.Jwt
Configuración
1. Añade la configuración JWT en appsettings.json
{
"Jwt": {
"SecretKey": "TuClaveSecretaSuperSeguraDeAlMenos32Caracteres",
"Issuer": "https://tuaplicacion.com",
"Audience": "https://tuaplicacion.com",
"Expires": 1
}
}
2. Registra los servicios JWT en Program.cs
var builder = WebApplication.CreateBuilder(args);
// Añadir servicios JWT
builder.AddJwt(); // Usar configuración de "Jwt" por defecto
// o
builder.AddJwt("JwtSettings"); // Usar configuración desde otra sección
// Añadir otros servicios...
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configurar middleware
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseJwt(); // Añadir middleware JWT
app.MapControllers();
app.Run();
Uso
Generación de tokens
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IJwtService _jwtService;
public AuthController(IJwtService jwtService)
{
_jwtService = jwtService;
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
// Validar las credenciales del usuario (ejemplo simplificado)
if (model.UserName == "usuario" && model.Password == "contraseña")
{
// Generar el token JWT
var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
var token = _jwtService.GenerateToken(
UserName: model.UserName,
ipconnect: ipAddress,
UserId: 1,
roles: new List<string> { "User", "Admin" }
);
return Ok(new { token });
}
return Unauthorized();
}
}
public class LoginModel
{
public string UserName { get; set; }
public string Password { get; set; }
}
Refresh de tokens expirados
[HttpPost("refresh")]
public IActionResult RefreshToken([FromBody] RefreshTokenRequest request)
{
try
{
// Generar un nuevo token a partir del token expirado
var newToken = _jwtService.RefreshToken(request.ExpiredToken);
return Ok(new { token = newToken });
}
catch (Exception ex)
{
return BadRequest(new { Message = ex.Message });
}
}
public class RefreshTokenRequest
{
public string ExpiredToken { get; set; }
}
Protección de endpoints con autenticación JWT
[Authorize]
[HttpGet("user-info")]
public IActionResult GetUserInfo()
{
var userName = User.Identity?.Name;
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var roles = User.FindAll(ClaimTypes.Role).Select(c => c.Value).ToList();
var ipAddress = User.FindFirst("ipconnect")?.Value;
return Ok(new
{
UserName = userName,
UserId = userId,
Roles = roles,
IpAddress = ipAddress
});
}
Verificación manual de tokens
[HttpPost("validate-token")]
public IActionResult ValidateToken([FromBody] TokenValidationRequest request)
{
try
{
var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
var principal = _jwtService.ValidateToken(request.Token, ipAddress);
if (principal == null)
{
return BadRequest(new { IsValid = false, Message = "Token inválido" });
}
var userName = principal.Identity?.Name;
var userId = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var roles = principal.FindAll(ClaimTypes.Role).Select(c => c.Value).ToList();
return Ok(new
{
IsValid = true,
UserName = userName,
UserId = userId,
Roles = roles
});
}
catch (Exception ex)
{
return BadRequest(new { IsValid = false, Message = ex.Message });
}
}
public class TokenValidationRequest
{
public string Token { get; set; }
}
Extracción de claims de tokens (incluso expirados)
[HttpPost("get-claims")]
public IActionResult GetTokenClaims([FromBody] TokenClaimsRequest request)
{
try
{
var principal = _jwtService.GetTokenClaims(request.Token);
if (principal == null)
{
return BadRequest(new { IsValid = false, Message = "Token inválido" });
}
var userName = principal.Identity?.Name;
var userId = principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var roles = principal.FindAll(ClaimTypes.Role).Select(c => c.Value).ToList();
var ipAddress = principal.FindFirst("ipconnect")?.Value;
return Ok(new
{
UserName = userName,
UserId = userId,
Roles = roles,
IpAddress = ipAddress
});
}
catch (Exception ex)
{
return BadRequest(new { Message = ex.Message });
}
}
public class TokenClaimsRequest
{
public string Token { get; set; }
}
Implementación de seguridad
Esta biblioteca permite opcionalmente verificar que los tokens se utilicen desde la misma dirección IP desde donde fueron generados. Esta validación ahora es opcional y está desactivada por defecto para mejorar la compatibilidad con distintos escenarios de red.
Opciones de configuración
Propiedad | Descripción | Obligatorio |
---|---|---|
SecretKey | Clave secreta para firmar tokens (mínimo 32 caracteres) | Sí |
Issuer | Emisor del token | Sí |
Audience | Audiencia del token | Sí |
Expires | Días hasta la caducidad del token (null = sin expiración) | No |
Compatibilidad
- .NET 9.0+
Licencia
MIT License - Ver LICENSE para más detalles.
Contribuciones
Las contribuciones son bienvenidas. Por favor, envía pull requests o abre issues en GitHub.
Autor
José Andrey Salazar Guzmán - GitHub
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. |
-
net9.0
- Microsoft.AspNetCore.Authentication.JwtBearer (>= 9.0.3)
- System.IdentityModel.Tokens.Jwt (>= 8.7.0)
- System.Text.Json (>= 9.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.