如何检查已定义策略的令牌?

How to check token for already defined policy?

这是我使用控制器策略处理授权的方式:

在“Startup.cs”处,在“ConfigureServices”方法中添加以下代码:

services.AddAuthorization(options =>
{
    options.AddPolicy("can_work", policy => policy
      .RequireClaim("my_app", "user", "admin")
    );
});

然后只需用属性装饰给定的控制器或特定方法:

[Authorize(Policy = "can_work")]

因为只有具有匹配策略的用户才能被授予使用 controller/method。

现在,我遇到了不能仅依赖属性的情况 -- 我手头有用户令牌,我必须决定是否授予访问权限。我可以手动复制上述策略规则,但这意味着我会在两个地方重复自己。所以我想以某种方式检索我已经设置的那些策略并检查哪些令牌匹配。怎么做?


也许我换个说法——我知道我可以手动迭代令牌声明:

foreach (var claim in token.Claims)
    // manually check the value and type, and basically repeat policy again

这将是 (a) 重复 (b) 当某些事情发生变化时容易出错。相反,我想打个电话

policy_service.GetPoliciesForToken(token);

这将命中我用策略定义的授权服务(请参阅问题顶部)。现在我不知道怎么写这样的行。

背景 我描述了我需要这个的目的,因为也许有更简单的方法 -- SignalR 广播。当客户端调用 SignalR 方法时,我也可以使用属性,但是当服务启动流程时,假设它每 1 秒向其所有客户端发送一个滴答声,那么我想知道我可以将它发送给哪个客户端。所以我的想法是在连接到 SignalR hub 时检查用户令牌,检索匹配的策略(这部分我不知道该怎么做 reusing 已经设置了策略选项),然后当广播任何内容只是根据缓存的信息过滤掉客户端。

暂时出于安全考虑对我来说已经足够了。

按照King King的提示,在某种程度上,我现在有了一个定义和共享检查。

我更改了策略的构建方式。我手动构建它们并保留它们的实例也用于我的目的(见下文):

AuthorizationPolicy work_policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .RequireClaim("my_app", "user", "admin")
            .Build();

然后我调用 services.AddAuthorization(options... 策略实例,它像以前一样为控制器工作。

至于 SignalR hub,我在构造函数 IAuthorizationService 中请求,当用户通过属性 Authorize 连接时,我一方面提供了 this.Context.User,并且我有我的策略实例,因此我可以打这样的电话:

AuthorizationResult auth_result = await authService.AuthorizeAsync(this.Context.User, work_policy);

检查给定的用户是否匹配或不匹配给定的策略。