如何配置Azure移动App Service+B2C认证访问Azure SQL解决Xamarin同步错误
1. 代码缺失逻辑:未将B2C令牌传入MobileServiceClient
MobileServiceClient不会自动读取MSAL库获取的认证令牌,你需要手动将登录成功后拿到的令牌赋值给MobileServiceClient的当前用户属性,所有同步/请求操作才会自动携带认证头。
修改步骤:
在SignInInteractively方法拿到authResult后,补充令牌赋值代码:
private async Task<UserContext> SignInInteractively() { AuthenticationResult authResult = await _pca.AcquireTokenInteractive(B2CConstants.Scopes) .ExecuteAsync(); var newContext = UpdateUserInfo(authResult); UserSingleton.Instance.UserId = newContext.UserIdentifier; // 新增:将B2C令牌设置到MobileServiceClient azureService.mClient.CurrentUser = new MobileServiceUser(authResult.Account.Username) { MobileServiceAuthenticationToken = authResult.IdToken }; return newContext; }
注意:
- 如果你的
MobileServiceClient是单例实现,确保每次静默刷新令牌后,都同步更新CurrentUser的令牌值,避免令牌过期导致认证失败。 - 如果后端配置校验的是访问令牌,将
authResult.IdToken替换为authResult.AccessToken即可。
2. 后端配置修正
你之前的两个报错分别对应两个配置问题:
配置1:补全允许的令牌受众
App Service身份验证配置中的allowed token audiences必须填写你的B2C原生应用(MobileB2C)的客户端ID,也就是代码中B2CConstants.ClientID的值。不填该字段时,后端EasyAuth模块会无法通过令牌的aud字段校验,导致CancelledByAuthentication错误。
配置2:修改未认证请求的响应方式
你调整配置后出现CancelledByNetworkError,是因为你把未认证请求的处理逻辑改成了重定向到B2C登录页,MobileServiceClient无法处理302重定向响应,会识别为网络异常。将该配置修改为返回401未授权即可解决。
配置3:校验发行者URL一致性
核对App Service中自动生成的发行者URL,与你的B2C用户流的发行者完全一致:你可以访问B2C用户流的OpenID配置端点,查看返回的iss字段值,与App Service身份验证配置中的发行者URL完全对齐(包括末尾斜杠也要一致)。
通信逻辑说明
MobileServiceClient的所有请求(包括PushAsync、PullAsync等同步操作),都会自动将CurrentUser中存储的MobileServiceAuthenticationToken添加到请求的Authorization头中,格式为Bearer <令牌值>。后端App Service的EasyAuth模块会自动校验该令牌,校验通过后才会转发请求到后端服务操作关联的Azure SQL表,不需要你手动在每个请求里传令牌。
内容的提问来源于stack exchange,提问作者scott

