gpt4 book ai didi

c# - Asp.Net 核心 : Access custom AuthorizeAttribute property in AuthorizeHandler

转载 作者:行者123 更新时间:2023-12-04 03:05:55 27 4
gpt4 key购买 nike

因为我正在处理 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com