[英]Pass connection string to custom AuthorizeAttribute in asp.net core
[英]Asp.Net Core: Access custom AuthorizeAttribute property in AuthorizeHandler
当我在Asp.Net core Authorization
部分工作时,我需要在AuthorizeAttribute
中使用一个新属性,我想将其用作额外的权限值。 所以,我在自己的自定义Authorize属性中扩展了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);
}
}
我已经完成了所有相应的服务集合映射,这里省略了。
现在,我希望我的属性在控制器操作级别上使用如下:
[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}
有人会建议我如何在处理程序RolePermissionAccessRequirement中访问Action方法顶部给出的权限属性值 ?
我想基于Action方法顶部的Authorize attribute
给出的自定义权限值来执行某种访问规则。
提前致谢!
要参数化自定义Authorize
属性,请创建实现IAsyncAuthorizationFilter
的授权过滤器。 然后将过滤器包装在TypeFilterAttribute
-derived属性中。 此属性可以接受参数并将其传递给授权过滤器的构造函数。
用法示例:
[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>
看看这个 GitHub项目的完整示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.