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

ZUMO登录返回的SID与Azure ADB2C用户ObjectId不符的技术咨询

这些sid:开头的标识符来自哪里?

你看到的sid:...格式的用户ID,是Azure App Service(你的后端部署平台)为每个通过ADB2C认证的用户生成的内部本地用户标识符,和ADB2C里的Object ID(也就是你从IdToken里拿到的sub值)完全是两个不同的东西。

为什么会生成这个SID?

Azure App Service内置的身份验证/授权功能(常被称为Easy Auth),会为每一个成功通过第三方身份提供商(比如你的ADB2C)认证的用户,生成一个独立的、平台内部的用户标识。这么做的核心目的是:

  • 解耦后端业务逻辑和上游身份提供商的ID体系,不管你用ADB2C、Facebook还是Google,App Service都用统一格式的本地ID来管理用户会话和权限
  • 避免直接依赖外部提供商的ID结构,防止未来提供商ID格式变化影响你的业务

这个SID就是Easy Auth生成的本地标识,它和ADB2C的Object ID之间存在一对一的映射关系,但存储在App Service的内部系统里,你在ADB2C面板里是看不到的。

怎么在后端拿到ADB2C的原始Object ID?

你现在的需求是用ADB2C的Object ID(sub声明)来过滤用户数据,而不是这个SID,其实很简单:
在你的ASP.NET后端控制器里,不要直接使用默认的NameIdentifier声明(这个默认对应App Service生成的SID),而是直接从IClaimsPrincipal里提取ADB2C的sub声明,代码示例:

// 不要用这个(会拿到sid)
// var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

// 用这个拿到ADB2C的Object ID
var adb2cObjectId = User.FindFirst("sub")?.Value;

只要你在ADB2C的用户流里配置了User's Object Id这个输出声明(你已经做了),那么这个sub声明就会被包含在AccessToken里,并且会被App Service的认证中间件传递到后端的ClaimsPrincipal中。

关于MobileServiceClient的小补充

你看到MobileServiceUser的UserId是SID,这是因为MobileServiceClient默认使用App Service Easy Auth返回的本地用户标识。如果你想在客户端获取ADB2C的Object ID,应该直接从MSAL返回的IdToken里解析sub字段(就像你现在做的那样),而不是依赖MobileServiceUser的UserId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:55:23