如何从 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 AD B2C 用户的上次登录时间戳?
如何使用 Azure AD B2C 获取 Facebook 个人资料图片
如何在 Web API 中验证 Azure B2C JWT 令牌?