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

时间:2021-01-21 10:58:48

标签: asp.net-core authorization signalr

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

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

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

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

[Authorize(Policy = "can_work")]

因此,只有具有匹配策略的用户才能使用控制器/方法。

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


也许我改写了——我知道我可以手动迭代令牌声明:

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 集线器时检查用户令牌,检索匹配的策略(这部分我不知道如何重用已经设置的策略选项),然后在简单地广播任何内容时根据缓存信息过滤客户端。

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

1 个答案:

答案 0 :(得分:0)

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

我改变了政策的构建方式。我手动构建它们并出于我的目的保留它们的实例(见下文):

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

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

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

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

检查给定的用户是否匹配或不符合给定的政策。