【问题标题】:Set up JWT Policies with Claims in .NET Core 3.1?在 .NET Core 3.1 中设置带有声明的 JWT 策略?
【发布时间】:2020-05-01 18:29:12
【问题描述】:

我正在尝试使用JWT 使用授权中间件设置我的项目。

这里是一个场景示例

我有 3 个模块

  1. 分析

    • 搜索
    • 查看
    • 保存
  2. 搜索

    • 搜索
    • 查看
    • 保存
  3. 管理员

    • 仅限管理员

根据我对多个博客的理解,我必须使用Policy 设置中间件,这将代表我的功能AnalyticsSearchAdmin。然后我用[Authorize(Policy="Analytics")] 装饰控制器,JWT 将针对Analytics 策略进行授权。

问题:

如果我的保单有多个功能,例如Search = 1View = 2Save = 3,其中Save 可以同时访问ViewSearch 我如何为该保单配置声明并将信息传递到@ 987654334@属性?

 services.AddAuthorization((options) =>
            {
                options.AddPolicy("Analytics", policy =>
                {
                    policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                    ???
                    ???
                    ???
                });
            });

[Authorize(Policy = "Analytics")]

【问题讨论】:

  • 那么你想在模块级别指定访问,还是需要在每个模块的功能级别控制访问?使用 [Authorize(Policy = "Analytics")] 意味着对 Analytics 模块的访问毫无意义。
  • @BryanLewis 如果可能的话,我想指定中间件级别的授权配置。所以,在控制器动作之后,我可以做这样的事情Authorize(Policy="Analytics", SomethingElse="Search") 这个动作将可以访问Analytics 模块并且只有搜索功能,但是如果用户有Save 功能那么他/她应该能够访问@ 987654340@ 和 View

标签: .net asp.net-core jwt


【解决方案1】:

我认为你有几个选择。如果您想使用策略并且只需要控制每个模块的访问权限,那么您将创建 3 个策略并将一个或多个声明添加到给定用户的令牌以进行检查。显然,保单和索赔的名称取决于您:

services.AddAuthorization(options =>  
{  
    options.AddPolicy("Analytics", policy => policy.RequireClaim("AllowAnalytics"));  
    options.AddPolicy("Search", policy => policy.RequireClaim("AllowSearch")); 
    options.AddPolicy("Admin", policy => policy.RequireClaim("AllowAdmin"));  
}); 

Controller 将具有您之前指定的 auth 属性:

[Authorize(Policy = "Analytics")]

并且您必须在发布用户的 JWT 令牌时添加多个声明(AllowAnalytics、AllowSearch、AllowAdmin)之一。这种方法非常简单,但不能很好地扩展。只针对三个领域,还可以,但是如果你有更多的模块或者需要更细粒度的控制,那就不行了。

如果您的用户可以整齐地分类为角色,并且操作权限可以轻松映射到这些角色,那么您最好使用该选项。这可以通过内置的 ASP.Net 身份角色 ([Authorize(Roles = "Analytics,Admin")]) 来完成,或者只是向 JWT 令牌添加“角色”声明并使用 RequireClaim 策略,如上例所示。

最后,如果您有更复杂的要求,例如任何用户都可以拥有任意权限组合(用户 A 需要 Analytics-View 和 Search-Search,但仅此而已),那么您可能希望采用更复杂的解决方案,涉及为每个控制器操作分配特定的访问权限,并将用户的访问组合存储在数据库或其他东西中。在 GitHub 上查看 John P Smith 关于他的解决方案和代码的帖子,非常好:

【讨论】:

  • 感谢您的详细解释和您提供此信息的时间。您对实现自己的自定义 Authorize 属性有何想法​​?
  • 没问题。如果您认为此答案足够,请将其标记为已回答。
  • 当然。顺便说一句,您对编写自定义 Authorize 属性的想法有何看法?
猜你喜欢
  • 2021-02-26
  • 2020-05-22
  • 1970-01-01
  • 2020-04-06
  • 2020-05-30
  • 1970-01-01
  • 2019-04-15
  • 2022-06-13
  • 2018-05-08
相关资源
最近更新 更多