如果没有第二次调用服务器,请求确认IdentityServer 3不支持自定义声明

Rob*_*aft 6 oauth claims-based-identity

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

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

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

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

Rob*_*aft 6

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

  1. 创建自定义范围.确保Type = ScopeType.Resource和IncludeAllClaimsForUser = false,并将Scope的集合添加到作用域,并将ScopeClaim的第二个参数设置为true.
  2. 将自定义范围添加到客户端.
  3. 在您的IUserService覆盖中,在AuthenticateLocalAsync中,确保将user.Claims作为AuthenticateResult调用中的第3个参数传递.
  4. 在您的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);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最后,为了确保每次用户登录时都会触发GetProfileDataAsync,而不仅仅是第一次,请确保您没有启用缓存.这可能意味着删除启动中的一行代码,如下所示:factory.ConfigureUserServiceCache().