Xamarin.Forms中Azure Mobile Apps认证无法跳转回Android应用问题
嘿,我帮你梳理下这个认证卡住的问题,分Android和UWP两个场景给你针对性的解决方案:
先看Android端的问题
你现在遇到的是登录后停留在浏览器、无法跳转回应用的情况,大概率是回调URL的配置或者代码调用的细节出了问题,按下面的步骤排查:
修正LoginAsync的调用参数
你当前调用LoginAsync时只传了scheme,但SDK需要的是完整的回调URL。把代码改成这样:await client.LoginAsync(_context, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, new Uri("lookatmetestingthisurischeme://easyauth.callback"));或者直接传字符串形式的完整URL也行,之前只传scheme会导致SDK生成的回调地址不完整,没法触发Android的Intent跳转。
再核对Manifest的Activity配置
你的Manifest配置看起来没问题,但要确认两点:- 包名
com.companyname.MyApp和你Android项目的实际包名完全一致,包名不匹配会让Intent过滤失效。 - 你已经正确安装了
Microsoft.Azure.Mobile.ClientNuGet包,确保RedirectUrlActivity这个类存在(是SDK自带的,不用自己写)。
- 包名
检查Azure门户的回调URL
一定要保证Azure Mobile Apps认证设置里的回调URL和你代码里用的完全一样——lookatmetestingthisurischeme://easyauth.callback,哪怕多一个空格或者拼写错一个字母,Azure都会拒绝回调,导致停在浏览器。换系统浏览器测试
有些第三方浏览器对自定义scheme支持不好,先用Chrome或者系统自带浏览器试试,排除浏览器兼容性问题。
再解决UWP端的跳转问题
UWP的服务器流认证需要配置协议激活,才能让系统在登录完成后唤起你的应用,步骤如下:
配置Package.appxmanifest的协议声明
打开UWP项目的Package.appxmanifest:- 切换到「声明」选项卡,在下拉框选「协议」,点击「添加」。
- 「名称」填你的自定义scheme:
lookatmetestingthisurischeme,「显示名称」随便填个友好的名字就行。 - 确保「可执行文件」和「入口点」默认选中你的应用主入口。
在Azure门户添加UWP的回调URL
和Android一样,在Mobile Apps认证设置里添加lookatmetestingthisurischeme://easyauth.callback这个回调地址。修改UWP的登录代码
调用LoginAsync时指定完整的回调URL:await client.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, new Uri("lookatmetestingthisurischeme://easyauth.callback"));处理协议激活事件(关键步骤!)
打开App.xaml.cs,重写OnActivated方法,把回调的授权码传递给SDK:// 先把你的MobileServiceClient实例改成App类的静态成员,方便这里访问 public static MobileServiceClient Client { get; private set; } protected override void OnActivated(IActivatedEventArgs args) { if (args is ProtocolActivatedEventArgs protocolArgs) { var rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); Window.Current.Content = rootFrame; } // 让SDK处理回调的授权码 MobileServiceClientExtensions.ResumeWithURL(Client, protocolArgs.Uri); Window.Current.Activate(); } }记得在App的构造函数里初始化
Client实例,这样OnActivated里才能访问到它。测试跳转
完成这些配置后,登录成功后系统会通过你设置的协议自动唤起应用,SDK会处理剩下的认证流程。
内容的提问来源于stack exchange,提问作者NSouth

