使用 Keycloak 和 .NET 核心的基于角色的授权

Posted

技术标签:

【中文标题】使用 Keycloak 和 .NET 核心的基于角色的授权【英文标题】:Role based authorization using Keycloak and .NET core 【发布时间】:2019-10-13 03:09:17 【问题描述】:

在使用 dotnet core 2.2.3 和 Keycloak 4.5.0 进行基于角色的授权方面存在一些小问题。

在 Keycloak 中,我为“管理员”用户定义了一个角色“测试者”和一个客户角色“开发者”,并带有适当的角色映射。对 Keycloak 进行身份验证后;如果我查看 jwt.io 中的 JWT,我可以看到以下内容:


  "realm_access": 
    "roles": [
      "tester"
    ]
  ,
  "resource_access": 
    "template": 
      "roles": [
        "developer"
      ]
    ,
    ...
  ,
  ...

在 .NET 核心中,我尝试了很多方法,例如将 [Authorize(Roles = "tester")][Authorize(Roles = "developer")] 添加到我的控制器方法中,以及使用基于策略的授权,在我的 AuthorizationHandler<TRequirement> 实现中检查 context.User.IsInRole("tester") .

如果我在身份验证处理程序中设置了一些断点。当它被击中时,我可以看到在context.user.Claims IEnumerable 下列为项目的“测试人员”和“开发人员”角色,如下所示。

realm_access: "roles":["tester"]
resource_access: "template":"roles":["developer"]

所以我应该能够通过验证context.user.Claims 集合中realm_accessresource_access 的值来成功在身份验证处理程序中进行授权,但这需要我反序列化声明值,似乎只是 JSON 字符串。

我认为必须有更好的方法,否则我做的事情不太对。

【问题讨论】:

【参考方案1】:

“AspNetCore.Authorization”需要名为 “roles” 的声明(字段)中的角色。而且这个声明必须是一个字符串数组(多值)。您需要在 Keycloak 端进行一些配置。

第一种选择:

您可以更改现有的角色路径。

转到您的 Keycloak 管理控制台 > 客户端范围 > 角色 > 映射器 > 客户端角色

将“令牌声明名称”更改为“角色” 多值:真 添加到访问令牌:True

第二种选择:

如果您不想触及现有路径,您可以创建一个新的 Mapper 以在根目录处显示相同的角色。

转到您的 Keycloak 管理控制台 > 客户端范围 > 角色 > 映射器 > 创建

名称:“root 客户端角色”(或任何您想要的名称) 映射器类型:“用户客户端角色” 多值:真 令牌声明名称:“角色” 添加到访问令牌:True

【讨论】:

令牌声明名称必须是role 不是 roles 第三种选择:在这里查看我的答案:***.com/a/53817194/10801604

以上是关于使用 Keycloak 和 .NET 核心的基于角色的授权的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx 的 Keycloak 重定向 url 将转到 http 而不是 https

Net CORE Keycloak 和 OIDC

Keycloak 2.2.0.Final 发布,SSO 集成解决方案

Keycloak:用户基于角色的客户端登录访问限制

使用 Keycloak 作为 ASP.Net 应用程序的单一登录解决方案

基于iMXRT1052核心板设计的太阳能智能跟踪支架系统解决方案