我为什么想要这个?
我正在尝试从我的用户那里获取一个可以连接到数据库记录的唯一标识符。我不想使用电子邮件作为标识符是有原因的。我读到 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 吗?
我正在检索 OID 令牌,它的声明类型是:
http://schemas.microsoft.com/identity/claims/objectidentifier
从我提供的屏幕截图中可以清楚地看到。
如果您使用的是 Microsoft.Identity.Web 包,现在有一个 ClaimsPrincipalExtensions 类提供了扩展方法,因此您可以简单地使用:
// using Microsoft.Identity.Web;
User.GetObjectId();
这使用了
oid
或 http://schemas.microsoft.com/identity/claims/objectidentifier
声明。
我为此挣扎了一段时间,这篇文章对我有所帮助。
要使用某些代码更新内容,下面将获取对象标识符值(Azure 中的唯一用户 ID)
User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value
感谢您指出架构/类型的差异!
由于上面的链接已损坏,而且我真的很难找到一个有效的示例,所以这里是我最终使用的代码片段;
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();
}
希望这对其他人有帮助...