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

How do I get an OID claim in ASPCore from Azure B2C

我为什么要这个?

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

我走过的步数

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

我目前正在使用单独的登录和注册政策,我收回了所有声明,包括我指定要 returned 的电子邮件声明。但是我找不到与 OID 或 SUB 相关的声明。

User.Claims 

得到以下结果:

我找到的唯一希望面包屑是这个声明:

类型:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier

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

问题

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

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

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

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

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

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

由于上面的链接已损坏,我真的很难找到一个有效的示例,这里是我最终使用的代码片段;

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

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

我为此苦苦挣扎了一会儿,这个 post 帮助了我。

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

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

感谢您指出 schema/types 中的差异!

看来你这里不一定需要object-identifier。 调试的时候看到object-identifier的值映射到nameidentifier

可以使用内置常量访问 NameIdentifier:

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

如果您使用的是 Microsoft.Identity.Web 包,现在有一个 ClaimsPrincipalExtensions class 提供了一个扩展方法,因此您可以简单地使用:

// using Microsoft.Identity.Web;

User.GetObjectId();

这使用了 oidhttp://schemas.microsoft.com/identity/claims/objectidentifier 声明。