Idioma: English | Español
Obtén un método protegido por autorización UMS en cinco minutos. Asume que ya tienes un tenant UMS y puedes llamar a POST /api/v1/client/authenticate.
Para referencia completa, ver README.md.
dotnet add package Ums.Sdk.Authorization
dotnet add package Ums.Sdk.Authorization.AopPara tests:
dotnet add package Ums.Sdk.Authorization.TestingEn Program.cs:
using Ums.Sdk.Authorization;
using Ums.Sdk.Authorization.Aop;
using BeyondNetCode.Shell.DI;
builder.Services.AddAop(aop => aop
.AddAspect<AuthorizationAspect>());
builder.Services.AddUmsSdkAuthorization(); // validator + accessor default
builder.Services.AddHttpContextAuthGraphAccessor(); // integración ASP.NET CoreAgrega el middleware que decodifica el body del JWT y almacena el grafo en HttpContext.Items:
app.UseUmsAuthGraph(); // antes de UseAuthorizationEste middleware:
- Lee el header
Authorization: Bearer .... - Llama a
POST /api/v1/client/authenticatesi no hay grafo cacheado o el cacheado expiró. - Almacena el
AuthorizationGraphparseado enHttpContext.Items["UmsAuthGraph"]. - Valida
schemaVersioncontra el rango de compatibilidad del SDK; rechaza con401anteAUTH_205.
Agrega un atributo al método de la interfaz:
public interface IOrderService
{
[RequiresScope("PURCHASE_ORDER.APPROVE")]
Task<Result> ApproveOrderAsync(Guid orderId);
}
public class OrderService : IOrderService
{
public async Task<Result> ApproveOrderAsync(Guid orderId)
{
// tu lógica de negocio — corre solo si está autorizado
return Result.Success();
}
}Registra el servicio con proxy AOP:
builder.Services.AddAopProxy<IOrderService, OrderService>();Eso es todo. IOrderService.ApproveOrderAsync ahora está protegido. Llamarlo desde un endpoint u otro servicio:
app.MapPost("/orders/{id}/approve", async (Guid id, IOrderService svc) =>
{
var result = await svc.ApproveOrderAsync(id);
return result.IsSuccess ? Results.Ok() : Results.Forbid();
});Si el usuario autenticado no tiene PURCHASE_ORDER.APPROVE, ApproveOrderAsync lanza UnauthorizedAccessException antes de que corra el body.
[Fact]
public async Task ApproveOrder_WithoutScope_ReturnsForbidden()
{
var graph = AuthGraphBuilder
.ForTenant("LOGISTICS_CORE")
.WithUser("ana.flores@example.com")
.WithScope("PURCHASE_ORDER.VIEW") // VIEW pero no APPROVE
.Build();
var accessor = new TestAuthGraphAccessor(graph);
var service = AopProxyCreator.Create<IOrderService, OrderService>(
new OrderService(),
TestAspectExecutorFactory.Create(accessor));
await Assert.ThrowsAsync<UnauthorizedAccessException>(
() => service.ApproveOrderAsync(Guid.NewGuid()));
}[RequiresScope("PURCHASE_ORDER.APPROVE", OnDenied = DenialBehavior.ReturnFailure)]
Task<Result> ApproveOrderAsync(Guid orderId);builder.Services.Configure<AuthorizationOptions>(o =>
o.Mode = AuthorizationMode.AuditOnly);Las denegaciones se loguean pero no se bloquean. Observa los logs por entradas AuthorizationDeniedEvent, corrige los gaps, luego cambia a Enforce.
public class OrderController(IAuthorizationValidator validator, IAuthGraphAccessor accessor)
{
public IActionResult Approve(Guid id)
{
var decision = validator.RequireScope(accessor.Current, "PURCHASE_ORDER.APPROVE");
if (decision.IsDenied) return Forbid();
// ...
}
}