Для совместимости со старой системой вы можете создать простую авторизацию Filter
:
public class RequiredPermissionAttribute : Attribute, IAsyncAuthorizationFilter{
public RequiredPermissionAttribute(string permissions)
{
this.Permissions = string.IsNullOrEmpty(permissions) ?
new List<string>():
permissions.Split(",").Select(p =>p.Trim()).ToList();
}
public IList<string> Permissions {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,this.Permissions,"Require Permissions Policy");
if(!accessable.Succeeded){
context.Result = new ForbidResult();
}
}
}
и теперь вы можете использовать фильтр авторизации для перехвата запроса:
[RequiredPermission("101,102,103")]
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
return View();
}
Конечно, мы должны сначала зарегистрировать политику.:
services.AddAuthorization( o=> {
o.AddPolicy("Require Permissions Policy", pb =>{
pb.RequireAssertion(async context =>{
var user = context.User;
var permissions=context.Resource as IList<string>;
if(permissions == null || permissions.Count()==0 ){ return true; }
if(user.Claims.Any( c => c.Type=="MyCustomClaimType" && permissions.Any(p => p.Equals(c.Value)) ))
{
return true;
}
return false;
});
});
});
Для целей тестирования я просто добавляю простую функцию для проверки политики, вы можете настроить процесс авторизации по своему усмотрению.