令牌中的范围输出

And*_*nch 1 openid openiddict

我正在将我们的身份服务器从 IDSRv4 移至 Openiddict,但遇到了一个奇怪的“问题”

IdentityServerV4 生成的令牌将范围存储在数组中,而 Openiddict 生成的令牌将它们存储在字符串中。当使用 RequireClaim 访问这些范围时,此 RequireCliam 似乎无法处理令牌范围中的差异。

有人知道强制 Openiddict 将它们输出为数组的方法吗?

我尝试手动将它们添加到一个名为scope的新声明中,但这似乎被忽略了,我最终得到了一个名为scope的声明,其值为openid

pol*_*rov 5

我有同样的问题。我花了几个小时才弄清楚,但这是我的解决方案:

创建自定义处理程序:

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 中的范围。