如何从 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 声明的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Azure B2C 获取刷新令牌

我应该如何获取 Azure AD B2C 用户的上次登录时间戳?

如何使用 Azure AD B2C 获取 Facebook 个人资料图片

如何在 Web API 中验证 Azure B2C JWT 令牌?

如何从Xamarin Forms中的Azure B2C中删除缩放按钮

在 Postman 中为 Azure AD B2C 请求访问令牌