首页 > 解决方案 > 如何在 AddPolicy 语句中连接条件 RequireClaims 表达式

问题描述

我正在以这种方式配置我的授权方法:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Branch", 
            policy => policy.RequireClaim(ClaimTypes.Role, "Admin"));
    });

这与我在控制器中的“分支”策略完美配合。我需要实现的是允许多个声明要求..即使只有其中一个要求得到满足,也会发生身份验证。我通过在之后添加 BranchManager 声明来尝试这种方式。但它不起作用。

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Branch", 
                policy => policy.RequireClaim(ClaimTypes.Role, "Admin"));
            options.AddPolicy("Branch",
                policy => policy.RequireClaim(ClaimTypes.Role, "BranchManager"));
        });

我还尝试连接 RequireClaim 语句。

        services.AddAuthorization(options =>
        {
            options.AddPolicy("Branch", 
                policy => policy.RequireClaim(ClaimTypes.Role, "Admin")
                                .RequireClaim(ClaimTypes.Role, "BranchManager"));
        });

而且它也不起作用,因为系统期望“Admin”和“BranchManager”声明都被清除。有没有一种优雅的方法来实现这一点:如果至少满足一个要求,则授权?

标签: c#.net.net-core

解决方案


如果您深入研究 Microsoft.AspNetCore.Authorization.AuthorisationPolicyBuilder 的源代码,您将看到该方法的一个版本,如下所示

公共 AuthorizationPolicyBuilder RequireClaim(string claimType, IEnumerable requiredValues);

第二个参数必须是您所追求的值的 IEnumerable。

options.AddPolicy("Branch", 
                policy => policy.RequireClaim(ClaimTypes.Role, new List<string> {"Admin", "BranchManager" }));

推荐阅读