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

Posted

技术标签:

【中文标题】如何从 Azure B2C 获取 ASPCore 中的 OID 声明【英文标题】:How do I get an OID claim in ASPCore from Azure B2C 【发布时间】:2016-12-23 00:51:03 【问题描述】:

我为什么要这个?

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

我已采取的步骤

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

我目前正在使用单独的登录和注册策略,并且我收到了所有索赔,包括我指定的我想要退回的电子邮件索赔。但是,我找不到与 OID 或 SUB 相关的索赔。

User.Claims 

让我得到以下结果:

我发现的唯一希望是这种说法:

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

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

问题

我是否遗漏了一些您需要执行以检索此特定声明的额外步骤?

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

【问题讨论】:

【参考方案1】:

好吧,这很尴尬,我一定看过这条线大约 30 次并没有注意到......

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

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

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

【讨论】:

schemas.microsoft.com/identity/claims/objectidentifier 类型来自映射它们的解析库。可以在启动时清除这些映射以避免那些烦人的事情:) 我遇到了同样的问题,只是我没有设置声明。我注意到 nameidentity 声明有一个与声明的对象 ID 匹配的 guid。 问题的答案是一个链接,该链接是库用于声明类型的内容。从屏幕截图中可以看出,三种声明类型的值为 URL。将其想象为 XML 模式,您通常将命名空间定义为 URL - 它使其独一无二【参考方案2】:

我为此苦苦挣扎了一段时间,这篇文章帮助了我。

用一些代码更新东西,下面将获取对象标识符值(Azure 中的唯一用户 ID)

User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value

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

【讨论】:

【参考方案3】:

由于上面的链接已损坏,而且我真的很难找到一个可行的示例,因此这是我最终使用的代码片段;

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();

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

【讨论】:

【参考方案4】:

这里似乎不一定需要对象标识符。 调试的时候看到object-identifier的值映射到nameidentifier

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

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

【讨论】:

并非总是如此,在我们的公司设置中,名称标识符与对象 ID 不同

以上是关于如何从 Azure B2C 获取 ASPCore 中的 OID 声明的主要内容,如果未能解决你的问题,请参考以下文章