gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:36 25 4
gpt4 key购买 nike

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

我只是想回来

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

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

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

使用下面的代码,我尝试返回上述 4 项声明,但仅返回

  • 用户 ID
  • 列表项正在通过。 enter image description here

我已经使用 JWT.IO 来测试返回 token ,并且我正在寻找的声明就在那里。

最后,让事情变得更奇怪的是,MS 似乎将我的电子邮件存储在用户名字段中,但没有向我显示电子邮件字段? enter image description here

我希望不必单独调用 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;
}

编辑

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

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

返回

所以我已将我的电子邮件更新到 belwo,它现在适用于 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";
}

最佳答案

用户属性是B2C从用户那里收集的信息。因此,B2C 仅收集一封电子邮件,“电子邮件地址”是一个字符串。声明是B2C返回给依赖方应用程序的信息。因为这里可能有多个电子邮件(来自多个资源,例如联合 Idp,这是一个集合。

您可以查看示例应用程序来了解如何解析声明 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);
}
}

关于c# - Azure B2C 如何检索内置用户声明/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57675567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com