oauth – 在没有第二次调用服务器的情况下确认IdentityServer 3不支持自定义声明

在我看来,我无法在我第一次调用Identity Server的响应中添加自定义声明(这是特定于用户的).有人可以证实这个假设吗?

以下是我们在应用中所做的事情:
使用ResourceOwner Flow,我们的Web应用程序(服务器端)调用Identity Server发送用户的logonID,密码和范围.

我们找回一个包含sub,idp,client_id等标准声明的JWT;但我们想补充一点.为简化起见,假设另一个声明是用户的emailAddress.

看来我们必须再次调用Identity Server并获取一个新令牌.那是对的吗?是不是有某些方法可以在初始调用中获得该值?

最佳答案
很抱歉成为回答我自己的问题的人,但我发现了如何使这项工作.

>创建自定义范围.确保Type = ScopeType.Resource和IncludeAllClaimsForUser = false,并将Scope的集合添加到作用域,并将ScopeClaim的第二个参数设置为true.
>将自定义范围添加到客户端.
>在您的IUserService覆盖中,在AuthenticateLocalAsync中,确保将user.Claims作为AuthenticateResult调用中的第3个参数传递.
>在您的IUserService覆盖中,在GetProfileDataAsync中添加以下代码:

if (context.RequestedClaimTypes != null)
{
    List<Claim> newclaims = new List<Claim>();
    foreach (Claim claim in context.Subject.Claims)
    {
        if (context.RequestedClaimTypes.Contains(claim.Type))
        {
            newclaims.Add(claim);
        }
    }
    context.IssuedClaims = newclaims;
}
return Task.FromResult(context.IssuedClaims);

>最后,为了确保每次用户登录时都会触发GetProfileDataAsync,而不仅仅是第一次,请确保您没有打开缓存.这可能意味着删除启动中的一行代码,如下所示:factory.ConfigureUserServiceCache().

转载注明原文:oauth – 在没有第二次调用服务器的情况下确认IdentityServer 3不支持自定义声明 - 代码日志