在我看来,我无法在我第一次调用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) { Listnewclaims = new List (); 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().