我正在将我们的身份服务器从 IDSRv4 移至 Openiddict,但遇到了一个奇怪的“问题”
IdentityServerV4 生成的令牌将范围存储在数组中,而 Openiddict 生成的令牌将它们存储在字符串中。当使用 RequireClaim 访问这些范围时,此 RequireCliam 似乎无法处理令牌范围中的差异。
有人知道强制 Openiddict 将它们输出为数组的方法吗?
我尝试手动将它们添加到一个名为scope的新声明中,但这似乎被忽略了,我最终得到了一个名为scope的声明,其值为openid
我有同样的问题。我花了几个小时才弄清楚,但这是我的解决方案:
创建自定义处理程序:
public class ScopesAsArrayHandler : IOpenIddictServerHandler<OpenIddictServerEvents.GenerateTokenContext>
{
public ValueTask HandleAsync(OpenIddictServerEvents.GenerateTokenContext context)
{
// backup OpenIdDict's custom scope claims
var scopes = context.Principal.GetClaims("oi_scp");
// remove OpenIdDict's custom scope claims
context.Principal.RemoveClaims("oi_scp");
// add backed up scopes as "scope" claims
context.Principal.AddClaims("scope", scopes);
return ValueTask.CompletedTask;
}
}
Run Code Online (Sandbox Code Playgroud)
并在 Program.cs(或 Startup.cs)的 .AddServer() 部分中注册处理程序:
builder.Services.AddOpenIddict()
.AddCore(...)
.AddServer(opts => {
...
opts.AddEventHandler<OpenIddictServerEvents.GenerateTokenContext>(b =>
{
b.UseSingletonHandler<ScopesAsArrayHandler>();
// make sure this is executed before weird stuff is done with the scopes
b.SetOrder(int.MinValue);
});
})
.AddValidation(...);
Run Code Online (Sandbox Code Playgroud)
现在您可以使用 OpenIdDict 的扩展方法principal.SetScopes(...)来设置 /connect/authorize 中的范围。
| 归档时间: |
|
| 查看次数: |
472 次 |
| 最近记录: |