You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asp.Net Core集成AAD IDP时UID、OID、SUB的获取及说明

针对Asp.Net Core + AAD获取跨应用一致用户ID的解决方案

核心结论:用OID(对象ID)作为跨应用唯一标识

OID是Azure AD中用户的全局唯一标识符,同一用户在所有关联的AAD应用中返回相同值,完全符合你“跨应用变体保持一致”的需求,适合作为数据库的主键或引用列。

为什么你获取不到OID声明?

默认情况下,AAD的v1端点不会自动返回OID声明,需要在应用注册中配置可选声明:

  • 登录Azure门户,找到你的应用注册
  • 进入「令牌配置」>「添加可选声明」
  • 选择ID令牌(或访问令牌,根据你的场景),勾选oid并保存

配置完成后,AAD就会在令牌中包含OID声明。

正确获取OID的代码

配置好可选声明后,用以下代码安全获取GUID格式的OID:

if (Guid.TryParse(User.Claims.FirstOrDefault(c => c.Type == "oid")?.Value, out Guid userId))
{
    // 使用userId进行数据库操作
}
else
{
    // 处理OID不存在或格式错误的情况
}

推荐用Guid.TryParse避免直接Parse抛出异常,提升代码健壮性。

关于UID/SUB和NameIdentifier的说明

  • UID/SUB:全称sub(Subject),是用户相对于单个应用的唯一标识,不同应用返回不同值,适合单应用内的用户标识,但不适合跨场景共享。
  • ClaimTypes.NameIdentifier:在Asp.Net Core中,这个Claim的映射规则取决于AAD的端点版本:
    • v1端点:默认映射到nameidentifier声明(对应UID)
    • v2端点:默认映射到sub声明(同样是应用级唯一ID)
      这就是你两种方式获取结果不同的原因——ClaimTypes.NameIdentifier和直接取uid在不同端点下的映射可能有差异,但本质都是应用级的用户ID,而非全局唯一的OID。

为什么有人用UID/SUB而非OID?

UID/SUB是OAuth2.0和OpenID Connect标准定义的声明,兼容性更好;而OID是Azure AD特有的声明。如果你的系统只需要单应用内的用户标识,或者需要兼容其他IDP,UID/SUB是更通用的选择。但你的场景是跨应用一致的数据库标识,OID是最优解。


内容的提问来源于stack exchange,提问作者Coden00b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:31:05