Azure B2C 如何检索内置用户声明/属性

4

我正在尝试从Azure B2C中检索一些非常基本的信息,使用内置用户属性和声明。

我只想返回

  1. 名字
  2. 姓氏
  3. 用户ID
  4. 电子邮件

对我来说,B2C如何存储此内容并不完全明显...... 登录/注销策略(用户属性)显示电子邮件地址为字符串 Img 1

但是登录/注销策略(应用程序声明)将电子邮件地址显示为stringCollection Img 2

使用以下代码,我正在尝试返回上述4个声明,但仅

  • 用户ID
  • 列表项正在到来。 输入图像描述

我已经使用JWT.IO测试了返回令牌和我要查找的声明。

最后,为了让事情变得更加奇怪,MS似乎将我的电子邮件存储在用户名字段中,但没有显示电子邮件字段吗? 输入图像描述

我希望不必单独调用Graph API即可获取我想要的这2-3个字段。

我只是希望有人可以帮助我澄清我的代码出了什么问题。

    var claimsIdentity = (ClaimsIdentity)HttpContext.User.Identity;
    var userIdClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
    if (userIdClaim != null)
    {
        userId = userIdClaim.Value;
        ViewData["userId"] = userId;
    }
    var GivenNameClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.GivenName);
    if (GivenNameClaim != null)
    {
        GivenName = GivenNameClaim.Value;
        ViewData["GivenName"] = GivenName;
    }
    var SurNameClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.Surname);
    if (SurName != null)
    {
        SurName = SurNameClaim.Value;
        ViewData["Surname"] = SurName;
    }
    var EmailClaim = claimsIdentity.Claims.SingleOrDefault(c => c.Type == ClaimTypes.Email);
    if (Email != null)
    {
        Email = EmailClaim.Value;
        ViewData["Email"] = Email;
    }

编辑

将以下内容添加到我的视图中有所帮助...

  @foreach (Claim claim in User.Claims)
    {
     <tr>
     <td>@claim.Type @claim.Subject</td>
     <td>@claim.Value</td>
     </tr>
    }

它返回

因此,我已将我的电子邮件更新为下面的内容,现在可以用于3/4个文件,但不会返回电子邮件集合。

var Claims = User.Claims;
var SurNameClaim = Claims.SingleOrDefault(c => c.Type == ClaimTypes.Surname);
ViewData["Surname"] = SurNameClaim.Value;

var GivenNameClaim = Claims.SingleOrDefault(c => c.Type == ClaimTypes.GivenName);
ViewData["GivenName"] = GivenNameClaim.Value;

var ClientIdClaim = Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
ViewData["ClientId"] = ClientIdClaim.Value;

var EmailClaim = Claims.SingleOrDefault(c => c.Type == ClaimTypes.Email);
if (EmailClaim != null)
{
    ViewData["Email"] = EmailClaim.Value;
}
else
{
    ViewData["Email"] = "Is Null";
}
1个回答

2
用户属性是aad B2C从用户那里收集的信息。因此,B2C只收集单个电子邮件,即“电子邮件地址”是一个字符串。 声明是B2C返回给依赖方应用程序的信息。由于可能会有多个电子邮件(来自多个资源,例如联合Idp),因此这是一个集合。 您可以查看示例应用程序以了解如何解析claims:https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/blob/master/TaskService/Controllers/TasksController.cs 如何读取值为数组的声明?
List<string> emails = new List<string>();
  IEnumerable<Claim> emailClaims =  Claims.Where(c => c.Type == ClaimTypes.Email);

                if (emailClaims.Any())
                {
                    // get the roles' actual value
                    foreach (Claim claim in emailClaims)
                    {
                        emails.Add(claim.Value);
                    }                   
                }

没问题。我会检查上面的例子并回复您。 - Tim Cadieux
NameIdentifier和GivenName可以正常工作,但Surname和Email无法使用。当使用JWT和测试用户流程时,我发现我的NameIdentifier出现在sub中,我看到了given_name和family_name,以及一个名为emails的集合,其中包含我的单个电子邮件地址。 - Tim Cadieux
你可以通过foreach查看User.Claims中的声明类型(key),并查看期望的key与你传递的key是否一致。 - Abhishek Agrawal
发布了一些编辑代码,现在我可以得到3/4个字段,但是我无法弄清如何返回电子邮件集合。 - Tim Cadieux
成功使用以下代码运行: var EmailClaim = ((ClaimsIdentity)User.Identity).FindFirst("emails").Value; - Tim Cadieux
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接