因为我正在处理 Asp.Net core Authorization
部分,我需要在 AuthorizeAttribute
中的新属性我想将其用作额外的权限值。所以,我扩展了 AuthorizeAttribute
在我自己的自定义授权属性中。见下文:
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);
}
}
所有相应的服务集合映射我已经做过了,这里就省略了。
现在,我希望我的属性在 Controller 操作级别上像这样使用:
[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}
有没有人推荐我我将如何访问处理程序 RolePermissionAccessRequirement 中 Action 方法顶部给出的权限属性值??
我想根据
Authorize attribute
中给出的自定义权限值执行某种访问规则在 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();
}
}
另外,注册一个
PermissionHandler
在 DI 中处理 PermissionRequirement
有权限列表:public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
看这个this GitHub 项目的完整示例。
关于c# - Asp.Net 核心 : Access custom AuthorizeAttribute property in AuthorizeHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432674/