Вы можете использовать Авторизация на основе политик в ASP.NET Core.
Чтобы удовлетворить ваши требования, сначала создайте политику авторизации:
services.AddAuthorization(options =>
{
options.AddPolicy("CustomRequire", policy =>
policy.Requirements.Add(new CustomerRequirement()));
});
Зарегистрируйте одно требование, создайте CustomerRequirement.cs
:
public class CustomerRequirement : IAuthorizationRequirement
{
public CustomerRequirement()
{
}
}
Создать CustomerHandler.cs
:
public class CustomerHandler : AuthorizationHandler<CustomerRequirement>
{
IHttpContextAccessor _httpContextAccessor = null;
public CustomerHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
CustomerRequirement requirement)
{
HttpContext httpContext = _httpContextAccessor.HttpContext;
var path = httpContext.Request.Path;
//split the path to get the customer base on your path .
var customerName = "customerFromPath";
if (!context.User.HasClaim(c => c.Type == "customer"))
{
return Task.CompletedTask;
}
var customer = context.User.FindAll(c => c.Type == "customer" ).FirstOrDefault();
if (customerName.Equals(customer.Value.ToString()))
{
context.Succeed(requirement);
}
//TODO: Use the following if targeting a version of
//.NET Framework older than 4.6:
// return Task.FromResult(0);
return Task.CompletedTask;
}
}
Чтобы использовать IHttpContextAccessor
, вам может потребоваться зарегистрировать это в настройках DI следующим образом:
services.AddHttpContextAccessor();
Зарегистрировать обработчик в наборе сервисов во время настройки:
services.AddSingleton<IAuthorizationHandler, CustomerHandler>();
Теперь вы можете применять политики к контроллерам MVC:
[Authorize(Policy = "CustomRequire")]
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "value";
}
Конечно, вы также можете зарегистрировать политику в вашем приложении.