我正在尝试从Azure B2C中检索一些非常基本的信息,使用内置用户属性和声明。
我只想返回
- 名字
- 姓氏
- 用户ID
- 电子邮件
对我来说,B2C如何存储此内容并不完全明显......
登录/注销策略(用户属性)显示电子邮件地址为字符串
但是登录/注销策略(应用程序声明)将电子邮件地址显示为stringCollection
使用以下代码,我正在尝试返回上述4个声明,但仅
我已经使用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>
}
它返回
- http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier 6902e027-e475-447c-8f7d-75f4451f85a4
- http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname Tim
- http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname Cadieux
- emails me@email.com
因此,我已将我的电子邮件更新为下面的内容,现在可以用于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";
}