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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:15:03