【发布时间】:2021-04-25 18:53:03
【问题描述】:
这是我使用控制器策略处理授权的方式:
在“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 集线器时检查用户令牌,检索匹配的策略(这部分我不知道该怎么做重用已经设置了策略选项),然后在简单地广播任何内容时根据缓存信息过滤掉客户端。
暂时出于安全考虑,这对我来说已经足够了。
【问题讨论】:
-
我不太明白你想要什么。用户令牌应包含所有用户声明(解析后)。令牌只是附加到请求的输入。因此,在初始化阶段,应该验证并解析相应的声明。您定义的授权策略应该会自动处理这些声明。
-
@KingKing,一方面我有令牌,它包含声明。我知道如何手动检索它们,并手动检查例如声明是否包含“admin”。我遇到的问题是我自己重复,我已经编写了代码处理声明。所以我不想手动检查令牌调用
policy_service.GetPoliciesForToken(token)。这样我可以 100% 确定,如果我改变给定声明的含义,它将影响所有代码。至于你的最后一句话,它会自动(感谢属性)来电,而不是广播(去电)。 -
如果您的网站支持 cookie 身份验证(支持登录会话),则解析用户声明的逻辑根本不会重复。这是您登录用户时的逻辑。但是,如果您的系统同时支持 cookie 和令牌身份验证(不登录用户),则可能会重复声明提取逻辑。但是我们可以将该逻辑重构为一个公共服务或类,以便在其他地方重用(登录、验证令牌......)。我们总是可以避免重复代码,因为我们可以控制逻辑(不是某种内置逻辑)。
-
@KingKing,我怀疑可以避免重复,但现在我不知道如何重用代码。我在调用
services.AddAuthorization时定义了策略,这肯定有效,所以我有工作定义,现在我想参考它并检查令牌。而这个我不知道该怎么做。 -
内置授权策略不能直接与令牌一起使用,而是与声明一起使用。所以看起来你没有一种简单的方法来重用该内置逻辑(如果我们查看它的源代码可能会有某种方法)。顺便说一句,您提到了
outgoing request,这对我来说并不清楚。那么目标是什么?第三方端点还是您的 api 端点?这似乎可以通过传播身份来解决。
标签: asp.net-core authorization signalr