C# Asp.Net核心:访问AuthorizeHandler中的自定义AuthorizeAttribute属性
由于我正在处理C# Asp.Net核心:访问AuthorizeHandler中的自定义AuthorizeAttribute属性,c#,asp.net-mvc,authentication,asp.net-core,authorization,C#,Asp.net Mvc,Authentication,Asp.net Core,Authorization,由于我正在处理Asp.Net核心授权部分,我需要AuthorizeAttribute中的一个新属性,我想将其用作额外的权限值。因此,我在自己的自定义授权属性中扩展了authorized属性。见下文: public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute { public string Permission { get; private set;
Asp.Net核心授权
部分,我需要AuthorizeAttribute
中的一个新属性,我想将其用作额外的权限值。因此,我在自己的自定义授权属性中扩展了authorized属性。见下文:
public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute
{
public string Permission { get; private set; }
public RoleAuthorizeAttribute(string policy, string permission) : base(policy)
{
this.Permission = permission;
}
}
然后,我创建了一个AuthorizationHandler
来检查需求,如下所示:
public class RolePermissionAccessRequirement : AuthorizationHandler<RolePermissionDb>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolePermissionDb requirement)
{
// check here..
context.Succeed(requirement);
return Task.FromResult(0);
}
}
是否有人建议我如何访问处理程序RolePermissionAccessRequirement中Action方法顶部给定的权限属性值
我想根据Action方法上方的Authorize属性中给定的自定义权限值执行某种访问规则
提前谢谢 要参数化自定义授权
属性,请创建一个实现IAsyncAuthorizationFilter
的授权筛选器。然后将过滤器包装在TypeFilterAttribute
派生属性中。此属性可以接受参数并将其传递给授权筛选器的构造函数
用法示例:
[AuthorizePermission(Permission.Foo, Permission.Bar)]
public IActionResult Index()
{
return View();
}
实施:
public class AuthorizePermissionAttribute : TypeFilterAttribute
{
public AuthorizePermissionAttribute(params Permission[] permissions)
: base(typeof(PermissionFilter))
{
Arguments = new[] { new PermissionRequirement(permissions) };
Order = Int32.MinValue;
}
}
public class PermissionFilter : Attribute, IAsyncAuthorizationFilter
{
private readonly IAuthorizationService _authService;
private readonly PermissionRequirement _requirement;
public PermissionFilter(
IAuthorizationService authService,
PermissionRequirement requirement)
{
//you can inject dependencies via DI
_authService = authService;
//the requirement contains permissions you set in attribute above
//for example: Permission.Foo, Permission.Bar
_requirement = requirement;
}
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
bool ok = await _authService.AuthorizeAsync(
context.HttpContext.User, null, _requirement);
if (!ok) context.Result = new ChallengeResult();
}
}
此外,在DI中注册一个PermissionHandler
,以使用权限列表处理PermissionRequirement
:
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
公共类PermissionHandler:AuthorizationHandler
查看这个GitHub项目,了解完整的示例
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>