Dam*_*n T 3 c# authentication asp.net-mvc authorization asp.net-core
在我进行Asp.Net core Authorization部分工作时,我需要一个新属性AuthorizeAttribute,我想将其用作额外的权限值。因此,我AuthorizeAttribute在自己的自定义 Authorize 属性中扩展了。见下文:
public class RoleAuthorizeAttribute : Microsoft.AspNetCore.Authorization.AuthorizeAttribute
{
public string Permission { get; private set; }
public RoleAuthorizeAttribute(string policy, string permission) : base(policy)
{
this.Permission = permission;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个AuthorizationHandler来检查要求,如下所示:
public class RolePermissionAccessRequirement : AuthorizationHandler<RolePermissionDb>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolePermissionDb requirement)
{
// check here..
context.Succeed(requirement);
return Task.FromResult(0);
}
}
Run Code Online (Sandbox Code Playgroud)
所有相应的服务集合映射我已经做过了,这里就省略了。
现在,我希望我的属性在控制器操作级别上像这样使用:
[RoleAuthorize("DefaultPolicy", "CustomPermission")]
public IActionResult List()
{
}
Run Code Online (Sandbox Code Playgroud)
有人会建议我如何访问处理程序 RolePermissionAccessRequirement 中 Action 方法顶部给出的权限属性值吗?
我想根据Authorize attributeAction 方法顶部给出的自定义权限值执行某种访问规则。
提前致谢!
要参数化自定义Authorize属性,请创建一个实现IAsyncAuthorizationFilter. 然后将过滤器包装在一个TypeFilterAttribute-derived 属性中。此属性可以接受参数并将其传递给授权过滤器的构造函数。
用法示例:
[AuthorizePermission(Permission.Foo, Permission.Bar)]
public IActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
执行:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
另外,PermissionHandler在DI中注册a来处理PermissionRequirement权限列表:
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
Run Code Online (Sandbox Code Playgroud)
查看此GitHub 项目以获取完整示例。
| 归档时间: |
|
| 查看次数: |
3593 次 |
| 最近记录: |