11

我为什么要这个?

我正在尝试从我的用户那里获取一个唯一标识符,我可以将其连接到数据库记录。我不想使用电子邮件作为标识符是有原因的。我读到 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?

4

4 回答 4

20

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

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

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

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

于 2016-08-16T15:22:45.710 回答
7

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

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

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

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

于 2019-08-13T19:06:35.343 回答
2

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

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

希望这会帮助别人......

于 2018-06-22T16:19:30.893 回答
1

看来您在这里不一定需要对象标识符。调试的时候看到object-identifier的值映射到nameidentifier 在此处输入图像描述

可以通过内置常量访问NameIdentifier

var identity = authState.User.Identity as System.Security.Claims.ClaimsIdentity;
var userId = identity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier).Value;
于 2020-01-23T11:54:22.287 回答