dotnet核心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")]
添加到控制器方法中,以及在检查context.User.IsInRole("tester")
时使用基于策略的授权在我的AuthorizationHandler<TRequirement>
实现中。
如果我在auth处理程序中设置了一些断点。遇到问题时,我可以在context.user.Claims
IEnumerable下看到作为项目列出的“测试人员”和“开发人员”角色,如下所示。
{realm_access: {"roles":["tester"]}}
{resource_access: {"template":{"roles":["developer"]}}}
因此,我应该能够通过验证realm_access
集合中的resource_access
和context.user.Claims
的值来成功地在auth处理程序中进行授权,但是这将要求我对声明值进行反序列化,这些声明值似乎只是JSON字符串。
我认为必须有更好的方法,否则我做的事情不正确。
答案 0 :(得分:0)
“ AspNetCore.Authorization”期望在名为“角色” 的声明(字段)中的角色。并且此声明必须是字符串数组(多值)。您需要在Keycloak端进行一些配置。
第一种选择:
您可以更改现有角色路径。
转到Keycloak管理控制台>客户端作用域>角色>映射器>客户端角色
第二种选择:
如果您不想触摸现有路径,则可以创建一个新的Mapper来在根目录显示相同的角色。
转到Keycloak管理控制台>客户端作用域>角色>映射器>创建