Вы можете создать пользовательский Authorization Filter
в сочетании с вашей политикой.
public class MyAuthorizeFilter: IAsyncAuthorizationFilter
{
public MyAuthorizeFilter(string policy)
{
Policy = policy;
}
public string Policy { get; set; }
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
var user = context.HttpContext.User;
var authZService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
var accessable = await authZService.AuthorizeAsync(user, null, this.Policy);
if (!accessable.Succeeded)
{
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
}
}
}
, и теперь вы можете использовать фильтр авторизации для перехвата запроса:
[MyAuthorizeFilter("MyPolicy")]
public IActionResult Index()
или глобально:
services.AddMvc(options =>
{
options.Filters.Add(new MyAuthorizeFilter("MyPolicy"));
});
Конечно, сначала нужно зарегистрировать политику.
services.AddAuthorization(o => {
o.AddPolicy("MyPolicy", pb => {
pb.RequireAuthenticatedUser();
//...
});
});