Xamarin iOS应用完成Azure AD B2C登录后无法返回的问题
解决Xamarin iOS中Azure AD B2C登录后无法返回应用的问题
我之前也碰到过一模一样的问题,大概率是URL Scheme配置不对或者B2C应用的回调地址没设置正确,咱们一步步来排查修复:
1. 先确认Azure AD B2C应用的回复URL配置
- 登录Azure门户,找到你的B2C租户里创建的Native应用
- 切换到「认证」标签页,在「回复URL」里添加
msal{你的ClientID}://auth,把{你的ClientID}替换成你代码里的那个ClientID(比如msal*********-0e3a-483a-9e15-7896c524ed1d://auth) - 这个格式是MSAL要求的标准回调地址,必须和后面iOS项目里的配置完全匹配
2. 配置Xamarin iOS项目的URL Scheme
- 打开iOS项目的
Info.plist,找到「URL Types」选项,点击新增一个URL类型 - 在「URL Schemes」输入框里填
msal{你的ClientID},同样替换成你的实际ClientID - 如果习惯编辑源代码,也可以直接修改Info.plist的XML内容,添加这段:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>msal*********-0e3a-483a-9e15-7896c524ed1d</string> </array> </dict> </array>
3. 在AppDelegate里处理登录回调(这步最容易忘!)
Xamarin iOS需要把系统的URL回调传递给MSAL,否则登录成功后不知道怎么回到你的应用。打开iOS项目的AppDelegate.cs,添加以下代码:
using Microsoft.Identity.Client; // 处理iOS 12及以下的回调 public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { if (PublicClientApplication.HandleMSALResponse(url, options)) { return true; } return base.OpenUrl(app, url, options); } // 处理iOS 13+的回调(必须加,不然新版本iOS会出问题) public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler) { if (userActivity.ActivityType == NSUserActivityTypeBrowsingWeb) { if (PublicClientApplication.HandleMSALResponse(userActivity.WebPageUrl, null)) { return true; } } return base.ContinueUserActivity(application, userActivity, completionHandler); }
4. 修正MSAL的初始化代码
你原来的代码里PCA是静态变量,建议在App初始化的时候用Builder模式创建,并且明确指定RedirectUri:
public static PublicClientApplication PCA = null; // Azure AD B2C Coordinates public static string Tenant = "something.onmicrosoft.com"; public static string ClientID = "*********-0e3a-483a-9e15-7896c524ed1d"; public static string PolicySignUpSignIn = "B2C_1_EmailSignup"; public static string PolicyEditProfile = "B2C_1_PasswordReset"; public static string PolicyResetPassword = "B2C_1_PasswordReset"; public static string[] Scopes = new string[] { "openid", "profile" }; // 示例Scope,根据你的需求调整 // 在App.xaml.cs的OnStart方法里初始化PCA protected override void OnStart() { var pcaBuilder = PublicClientApplicationBuilder.Create(ClientID) .WithB2CAuthority($"https://{Tenant}.b2clogin.com/tfp/{Tenant}/{PolicySignUpSignIn}") .WithRedirectUri($"msal{ClientID}://auth") // 这里必须和前面的配置完全一致 .Build(); PCA = pcaBuilder; }
最后再检查下:确保你的iOS项目安装了最新版本的Microsoft.Identity.Client NuGet包,旧版本可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者Raas Masood
相关产品推荐
相关产品推荐

