Oauth 寻求确认IdentityServer 3不支持自定义声明,无需第二次呼叫服务器

Oauth 寻求确认IdentityServer 3不支持自定义声明,无需第二次呼叫服务器,oauth,claims-based-identity,Oauth,Claims Based Identity,在我看来,我无法将自定义声明(特定于用户)添加到对Identity Server的第一次调用的响应中。有人能证实这个假设吗 以下是我们在应用程序中的操作: 使用ResourceOwner流,我们的web应用程序(服务器端)调用Identity server,发送用户的logonID、密码和作用域 我们得到一份JWT,其中包含标准声明,如sub、idp、客户id;但我们想再增加一个。为了简化,让我们假设另外一个声明是用户的电子邮件地址 看来我们必须再次调用Identity Server并获取新令牌

在我看来,我无法将自定义声明(特定于用户)添加到对Identity Server的第一次调用的响应中。有人能证实这个假设吗

以下是我们在应用程序中的操作: 使用ResourceOwner流,我们的web应用程序(服务器端)调用Identity server,发送用户的logonID、密码和作用域

我们得到一份JWT,其中包含标准声明,如sub、idp、客户id;但我们想再增加一个。为了简化,让我们假设另外一个声明是用户的电子邮件地址


看来我们必须再次调用Identity Server并获取新令牌。对吗?我们是否有办法在最初的通话中获得该值?

很抱歉回答我自己的问题,但我发现了如何实现这一点

  • 创建自定义范围。确保Type=ScopeType.Resource,includealClaimsforUser=false,并向作用域添加声明集合,并将ScopeClaim的第二个参数设置为true
  • 将自定义范围添加到客户端
  • 在IUserService覆盖中,在AuthenticateLocalAsync中,确保将user.Claims作为AuthenticateResult调用中的第三个参数传递
  • 在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);
    
    if(context.RequestedClaimTypes!=null)
    {
    List newclaims=newlist();
    foreach(context.Subject.Claims中的索赔)
    {
    if(context.RequestedClaimTypes.Contains(claim.Type))
    {
    新增索赔。添加(索赔);
    }
    }
    context.IssuedClaims=新索赔;
    }
    返回Task.FromResult(context.IssuedClaims);
    
  • 最后,要确保GetProfileDataAsync在用户每次登录时(而不是第一次)都会触发,请确保未启用缓存。这可能意味着在启动时删除如下代码行:factory.ConfigureUserServiceCache()


  • 非常感谢你。从过去两天开始,我一直在努力寻找解决方案。最后你的详细解释对我起了作用。