请求电子邮件范围时,Id令牌不包含电子邮件

时间:2018-11-22 13:44:22

标签: c# asp.net-core asp.net-identity identityserver4

我有一个身份服务器4应用程序,并且已添加到数据库中的电子邮件范围[IdentityResources]表。我还已将电子邮件范围添加到与客户端应用程序一起使用的客户端中。

客户端应用程序现在正在提示用户登录后同意电子邮件范围。

enter image description here

我还可以在UserClaimsPrincipalFactory中看到它

受保护的覆盖异步任务

GenerateClaimsAsync(ApplicationUser user)
        {
            var identity = await base.GenerateClaimsAsync(user);
            if (user.IsXenaSupporter)
                identity.AddClaim(new Claim("Supporter", user.Id.ToString()));
            return identity;
        }

身份确实包含电子邮件。但是,当Id令牌和访问令牌返回给应用程序时,它们都不包含电子邮件。从用户信息端点要求它时也没有电子邮件。

当应用程序请求电子邮件范围时,我需要怎么做才能在声明中填充电子邮件地址?另外,我的自定义支持者声明也未添加

2 个答案:

答案 0 :(得分:0)

一个简单的事实,即客户端应用程序提示您输入电子邮件范围,仅意味着该范围在IdentityServer中被允许并在客户端上被请求,但不一定要检索此信息。

神奇之处在于实现GetProfileDataAsync的{​​{1}}方法中。

此个人资料服务可让您检索所需的声明,并将其添加到IProfileService

ProfileDataRequestContext

正如here所述,id令牌几乎应该只有一个子声明-这就是public Task GetProfileDataAsync(ProfileDataRequestContext context) { var subjectId = context.Subject.GetSubjectId(); Guid.TryParse(subjectId, out Guid g); //whatever way or wherever you retrieve the claims from var claimsForUser = idRepo.GetUserClaimsBySubjectId(g); context.IssuedClaims = claimsForUser.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList(); return Task.FromResult(0); } 端点的作用。

答案 1 :(得分:0)

The problem was that i had only added it to the [IdentityResources] table.

enter image description here

This simply defines the different scopes. But it doesn't actually assign any data.

To do that i needed to add it to the [IdentityClaims] table.

enter image description here

As soon as i did this the data started being returned in the claims.