identityserver4 - 使用角色将 Identity Server 4 与 API 服务共同托管
问题描述
我遇到了一个将 Identity Server 4 与需要它进行身份验证和授权的 API 服务共同托管在同一应用程序主机上的示例。
现在我能够通过纯身份验证成功复制它,但是当涉及到使用角色的授权时,我无法让它工作,即 [Authorize(Roles = "My Role")]
在我的控制器操作上添加属性。访问令牌包含“角色”范围和声明,但似乎根本没有受到尊重。
我最初尝试了下面的代码,但它根本不执行 JWT Bearer 位,这让我相信 Identity Server 使用它自己的处理程序来达到这个目的,我根本不知道如何配置它。
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
// JWT tokens (default scheme)
.AddJwtBearer(options =>
{
options.Authority = "https://localhost:44367/";
options.Audience = "API";
options.TokenValidationParameters.RoleClaimType = "role";
});
然后我从示例代码中遇到了这一行(我最初在这篇文章中提到过),这似乎应该授予我与 Identity Server 一起运行 API 服务的能力:
services.AddLocalApiAuthentication();
但它似乎也没有做我想要的。
那么 Identity Server 身份验证中间件是否允许我完成基于角色的身份验证,或者是否有其他一些我需要研究的机制(即策略)?
值得注意的是,我能够使用 Identity Server 4 成功完成所有这些工作,但需要单独托管。我想看看如何将这一切都托管在一起。
解决方案
刚刚重新检查了这个例子,它工作得很好。
当你使用
services.AddLocalApiAuthentication();
它设置了IdentityServerAccessToken
authenticationScheme。
要在 API 控制器中使用它,请键入
[Authorize(IdentityServerConstants.LocalApi.PolicyName)]
如文档中所述,或者只是
[Authorize(AuthenticationSchemes = "IdentityServerAccessToken")]
检查角色所需的只是属性的另一个参数:
[Authorize(AuthenticationSchemes = "IdentityServerAccessToken", Roles = "test role1")]
推荐阅读
- python - 将 rgb 值转换为一个热标签
- c++ - 符号可见性 - 共享库与 dll
- spring-security - 使用带有 OAuth2 的 Spring Security 自定义 redirectUri
- laravel - 是否有一种内置方法可以从注册中删除帐户枚举?
- javascript - 如何按键填充集合数组并对值求和 Lodash.js
- c# - 上下弹跳图片框
- javascript - 获取通过props传递的另一个组件中url的id值 - vue
- java - 如何以功能样式多次编写“如果可选为空,则调用返回可选的下一个方法,如果不返回此非空可选”?
- reactjs - 使用 external_api.js 在 React Web 应用程序中添加 jitsi-Meet 视频会议
- python - 使用 python 3.7.7 安装 tensorflow 1.15 的问题