如何解决无法在 Identity Server 4 中正确实现 IProfileService
我有一个有效的授权设置并获得了一个包含以下内容的令牌。看起来,一切都按预期运行,配置文件中的验证按预期启动等。
{ ...
"awo": "bazinga",
"...schemas.microsoft.com../role": [ "role1","role2",... ]
"scope": [ "openid",...,"roles"],
}
现在,我想在访问令牌中添加一个额外的自定义声明。根据{{3}} where everywhere,我应该实现自定义IProfileService
,如图I read。因此,我首先添加了一个不会引起任何更改的虚拟服务。
services.AddIdentityServer(options => ...)
.AddInMemoryClients(Clients.Obtain())
...
.AddTestUsers(TestUsers.Obtain().ToList())
.AddProfileService<ProfileService>()
.AddDeveloperSigningCredential();
public async Task GetProfileDataAsync(ProfileDataRequestContext context) { }
public async Task IsActiveAsync(IsActiveContext context) { }
这导致请求的声明消失了!我仍然看到像 sub 和 exp 以及 scope 这样的标准声明。但是 role 声明消失了(以及我在 TestUser
实例的定义中所做的所有其他声明。我不知道为什么,谷歌搜索这给了我任何东西。纳达.零.Ziltch.
此外,我发现了两件事。第一个是在 context.RequestedClaimTypes
下的上下文中按类型提及消失的声明(没有值,只有类型)。我注意到的第二件事是,如果我修改如下所示的声明,它确实可以访问访问令牌。所以,我对发生的事情感到满意,除了之前的事情要再见的警告。我试图从上下文中隐藏它并重新添加它,但我没有在那里看到它们。
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
IEnumerable<string> temp = context.RequestedClaimTypes;
Claim[] claims = { new Claim("hazaa","shazoo") };
context.IssuedClaims.AddRange(claims);
}
我不知道我是否非常接近并且只是遗漏了一个小细节,例如对分析管道或基类的反馈,不知何故。或者,如果我离得很远,正在漂流。任何有关如何进一步调查的意见将不胜感激。 (一个可行的解决方案是最好的,但我不挑剔,还有很多战斗精神。)
我尝试基于 here 添加 services.AddScoped<IProfileService,ProfileService>()
- 行为没有变化。我已经尝试验证来自 this、here 和 here 的详细信息 - 没有任何有用的相关性。在 here 中,我相信他们有同样的问题,但解决方案不适用于我的情况。我已经尝试将 AlwaysIncludeUserClaimsInIdToken
设置为建议的 this question - 唯一的变化是方法 GetProfileDataAsync
被调用了一次/两次,正如预期的那样。我已将 AlwaysSendClientClaims
和 UpdateAccessTokenClaimsOnRefresh
设置为所讨论的 here 和 here - 没有变化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。