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

