如何从 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();
这使用了 oid
或 http://schemas.microsoft.com/identity/claims/objectidentifier
声明。
我为什么要这个?
我正在尝试从我的用户那里获取一个唯一标识符,我可以将其连接到数据库记录。我不想使用电子邮件作为标识符是有原因的。我读到 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();
这使用了 oid
或 http://schemas.microsoft.com/identity/claims/objectidentifier
声明。