为什么我要这个?
我试图从我的用户那里获取一个唯一的标识符,我可以连接到数据库记录。有理由我不想使用电子邮件作为标识符。我读到B2C不支持SUB声明,并在其中使用OID。
我采取的步骤
所以,我已经设置我的两个策略都返回Azure B2C上的对象ID:
我目前正在使用单独的SignIn和SignUp政策,然后我收到所有声明,包括我指定要退回的电子邮件声明。但是,我无法找到与OID或SUB相关的声明。
User.Claims
让我得到以下结果:
我发现的单一面包屑希望就是这个主张:
输入:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier
值:目前不支持。使用oid声明。
问题
我是否错过了为检索此特定声明而需要执行的其他步骤?
是否有人从Azure B2C检索OID或SUB有任何成功?
答案 0 :(得分:4)
嗯,这很尴尬,我必须看过这条线约30次并没有注意到......
我正在检索OID令牌,它的声明类型是:
http://schemas.microsoft.com/identity/claims/objectidentifier
从我提供的截图中可以清楚地看到。我将这个问题留下来,因为架构可能会让其他人失望。
答案 1 :(得分:1)
由于上面的链接已断开,这是我真的很难找到的可行示例,因此下面是我最终使用的代码片段;
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();
}
希望这对其他人有帮助...
答案 2 :(得分: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;
答案 3 :(得分:0)
我为此苦了一段时间,这篇文章对我有所帮助。
要使用某些代码更新内容,下面将获取对象标识符值(Azure中的唯一用户ID)
Host
感谢指出架构/类型的差异!