是否可以使用角色等 OR 条件进行声明授权?

zAn*_*ony 6 c# asp.net-web-api asp.net-core-3.0

我一直在我的 .net 应用程序中使用角色授权。但是,我正在构建一个演示应用程序并想尝试一下声明。我总是像这样装饰我的控制器,其中可以授权管理员或具有完全访问权限的用户。

[[Authorize(Roles = "IsApiUserFullAccess", "IsAdmin") ]]
Run Code Online (Sandbox Code Playgroud)

但是,我不能用声明来完成同样的事情。在我的初创公司中,我有这两项索赔政策。我如何装饰我的控制器或更改这些策略以声明由我的控制器授权?

options.AddPolicy("IsApiUserFullAccess", policy => policy.RequireClaim("apiuser.fullaccess", "true"));
options.AddPolicy("IsAdmin", policy => policy.RequireClaim("administrator", "true"));
Run Code Online (Sandbox Code Playgroud)

jBe*_*ger 5

您可以使用接受 Func<> 的 RequireAssertion() 方法来完成策略。

来源

例子:

services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOrFullAccess", policy =>
        policy.RequireAssertion(context =>
            {
                bool isApiUserFullAccess = context.User.HasClaim(c => ...);
                bool isAdmin = context.User.IsInRole("ADMIN_ROLE");
                return isAdmin || isApiUserFullAccess;
             });                    
});
Run Code Online (Sandbox Code Playgroud)


Chi*_*ils 4

一种方法是构建一个自定义策略,其中包含对用户声明进行或运算的要求和处理程序,如下所示:

// Marker class
public class HasFullAccessOrAdminRequirement : IAuthorizationRequirement {}

public class HasFullAccessOrAdminHandler 
: AuthorizationHandler<HasFullAccessOrAdminRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
        HasFullAccessOrAdminRequirement requirement)
    {
        var user = context.User;
        if (user.HasClaim(...) || user.HasClaim(...))
        {
            context.Succeed(requirement);
        }
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后注册它:

options.AddPolicy("AdminOrFullAccess", builder => 
    builder.AddRequirements(new HasFullAccessOrAdminRequirement());
Run Code Online (Sandbox Code Playgroud)

然后使用它:[Authorize("AdminOrFullAccess")]