作用域输出令牌



我正在将我们的身份服务器从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;
}
}

并在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(...);

现在您可以使用OpenIdDict的扩展方法principal.SetScopes(...)来设置/connect/authorize中的作用域。

最新更新