如何从Azure B2C获取ASPCore中的OID声明

时间:2016-08-16 15:05:29

标签: asp.net-core claims-based-identity openid-connect azure-ad-b2c

为什么我要这个?

我试图从我的用户那里获取一个唯一的标识符,我可以连接到数据库记录。有理由我不想使用电子邮件作为标识符。我读到B2C不支持SUB声明,并在其中使用OID。

我采取的步骤

所以,我已经设置我的两个策略都返回Azure B2C上的对象ID:

enter image description here

我目前正在使用单独的SignIn和SignUp政策,然后我收到所有声明,包括我指定要退回的电子邮件声明。但是,我无法找到与OID或SUB相关的声明。

User.Claims 

让我得到以下结果:

enter image description here

我发现的单一面包屑希望就是这个主张:

输入:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier

值:目前不支持。使用oid声明。

问题

我是否错过了为检索此特定声明而需要执行的其他步骤?

是否有人从Azure B2C检索OID或SUB有任何成功?

4 个答案:

答案 0 :(得分:4)

嗯,这很尴尬,我必须看过这条线约30次并没有注意到......

我正在检索OID令牌,它的声明类型是:

http://schemas.microsoft.com/identity/claims/objectidentifier

从我提供的截图中可以清楚地看到。我将这个问题留下来,因为架构可能会让其他人失望。

答案 1 :(得分:1)

由于上面的链接已断开,这是我真的很难找到的可行示例,因此下面是我最终使用的代码片段;

using System.IdentityModel.Tokens.Jwt;
...
string oid;
string pTokenInput = Request.Headers["x-ms-token-aad-id-token"].ToString();
var lJWTHandler = new JwtSecurityTokenHandler();
if (lJWTHandler.CanReadToken(pTokenInput)
{
    var lToken = lJWTHandler.ReadJwtToken(pTokenInput);
    if (lToken.Payload.ContainsKey("oid"))
        oid = lToken.Payload["oid"].ToString();
}

希望这对其他人有帮助...

答案 2 :(得分:1)

似乎您在这里不一定需要对象标识符。 调试时,我看到object-identifier的值映射到nameidentifier enter image description here

哪些可以通过内置常量NameIdentifier访问:

var identity = authState.User.Identity as System.Security.Claims.ClaimsIdentity;
var userId = identity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier).Value;

答案 3 :(得分:0)

我为此苦了一段时间,这篇文章对我有所帮助。

要使用某些代码更新内容,下面将获取对象标识符值(Azure中的唯一用户ID)

Host

感谢指出架构/类型的差异!