如何在保单索赔之间应用“OR”运算符

问题描述 投票:0回答:1

也许我的问题没有很好地表述,但我想知道如何创建一个 Blazor 授权策略,该策略在用户满足至少 1 项声明时有效,而不是必须满足策略中指定的所有声明。

我的代码目前是这样的:

builder.Services.AddAuthorization(options =>
        {
            // By default, all incoming requests will be authorized according to the default policy
            options.FallbackPolicy = options.DefaultPolicy;

            options.AddPolicy("AdminsAndMods", policy =>
            {
                policy.RequireClaim("Admin", "true");
                //policy.RequireClaim("Moderator", "true"); // I want the policy to be valid for admins and for moderators
            });
        });

如果我取消选中代码中的第二个“RequireClaim”,它将要求用户既是管理员又是主持人,但我希望如果用户至少拥有这两个声明中的一项,则根据策略进行验证。

我知道我可以使用角色来代替,并且角色可以在或[授权]内组合,但我不能使用它们。

asp.net-core blazor authorization
1个回答
0
投票

您需要使用实现多个

IAuthorizationRequirement
AuthorizationHandler

这是我从一个项目中取出的一个。它测试用户 ID 是否在记录的所有者字段中定义,或者是否具有管理员角色。如果满足其中一个要求,则要求成功。

public class RecordManagerAuthorizationRequirement : IAuthorizationRequirement { }

public class RecordOwnerManagerAuthorizationHandler : AuthorizationHandler<RecordManagerAuthorizationRequirement, AppAuthFields>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RecordManagerAuthorizationRequirement requirement, AppAuthFields data)
    {
        var entityId = context.User.GetIdentityId();
        if (entityId != Guid.Empty && entityId == data.OwnerId)
            context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

public class RecordManagerAuthorizationHandler : AuthorizationHandler<RecordManagerAuthorizationRequirement, AppAuthFields>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RecordManagerAuthorizationRequirement requirement, AppAuthFields data)
    {
        if (context.User.IsInRole(AppPolicies.AdminRole))
            context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

然后您可以定义策略:

    public static AuthorizationPolicy IsManagerAuthorizationPolicy
        => new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddRequirements(new RecordManagerAuthorizationRequirement())
        .Build();

如果您想查看此代码的上下文,这里有一个存储库:https://github.com/ShaunCurtis/Blazr.Demo.Authorization

© www.soinside.com 2019 - 2024. All rights reserved.