我很难让一个示例Xamarin.Forms / Azure应用程序与我自己的Azure B2C租户(特别是active-directory-b2c-xamarin-native)一起工作。
我能够立即使用示例,我的唯一更改是更新了所有XF NuGet软件包。在这一点上,Android版本(在我的Google Pixel上)和UWP版本都运行良好。在iOS上,我能够登录/注销并编辑配置文件(它仍然存在iPhoneSimulator无法将令牌正确保存在钥匙串中的已知问题,因此API和缓存无法正常工作,但我对此却忽略了现在,直到我可以得到一个实际的iPhone)。根据自述文件中的说明,当我尝试设置和使用自己的B2C租户时,问题就开始了。由于原始示例有效,因此可以安全地假定代码是正确的。我所做的唯一更改是对App.cs顶部的魔术字符串进行的更改,并将重定向URI存储在AndroidManifest.xml和Info.plist中。因此,工作原理是我要么输入了错误的字符串之一,要么B2C设置错误。我已经检查了多次,但是找不到问题。不过,我敢打赌,这些都是我的同一个错误所致。
问题1(已解决)。。UWP应用不允许登录。相反,当嵌入式浏览器打开时,我收到消息“我们无法立即连接到您需要的服务。请检查您的网络连接或稍后再尝试进行此操作”,然后在关闭该对话框后出现“ MsalException:WAB身份验证失败”对话框。浏览器。
这是到目前为止我唯一可以解决的问题,方法是在UWP.MainPage构造函数中注释掉此行:
UserDetailsClient.Core.App.PCA.RedirectUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri().ToString();
或通过将该GetCurrentApplicationCallbackUri()调用返回的值(类似于“ ms-app:// s-1-15-2-900855338 ....”)添加到的“自定义重定向URI”列表中B2C中的UI应用。我希望仅删除代码行,但这引出了一个问题,即为什么首先需要该代码行。也许有人可以提出建议,为什么在后端使用ms-app://重定向可能比其他平台使用的msalXXXX:// auth更可取。我不知道为什么原始示例使用ms-app://重定向;该字符串实际上在所有应用程序中都是恒定的,并且已经在示例的B2C租户中定义了。
问题2。克服了UWP登录问题,现在除API调用外,所有其他东西都可以在该平台上运行。我收到未授权的401。
API代码直接来自教程Develop Cloud Connected Mobile Apps with Xamarin and Microsoft Azure;它只是第1章的后端,[Authorize]属性已添加到TodoItemController。 (顺便说一句,所有第1章代码均有效)在Azure中,API本身(不是B2C租户)仍关闭了应用程序服务身份验证。如果我从TodoItemController中删除Authorize属性,只要我还传递了附加标头ZUMO-API-VERSION = 2.0.0,它就会起作用。不过,添加标头并不能帮助401。
由于我能够登录,所以我猜我有一个有效的访问令牌,这不是后端所期望的。同样,这适用于示例,因此我不知道我的应用程序有何不同。我怀疑此问题也会影响iOS和Android,但不确定,因为无法在这些平台上完成登录。带我去...
问题3。在Android和iOS上,单击“登录”后,应用程序将打开系统浏览器,并且我能够登录,但是随后的重定向不会发生,并且该应用程序仍保留在这是初始状态。调试时,永远不会到达对App.PCA.AcquireTokenAsync()的调用之后的行。没有异常。
据我了解,这通常是由于重定向URI的格式不正确或忘记添加特定于平台的重定向代码(Android上的Intent-filter或iOS上的OpenUrl)所致。我已经对URI进行了六次仔细检查,并且自示例工作以来,代码必须正确。我确实注意到了Android logcat中的ActivityManager START条目,因此浏览器正在发送重定向,但是该应用出于任何原因均未对其进行响应。还请注意,UWP客户端确实使用相同的msalXXXX:// auth URI来工作(这就是为什么我不愿意解释上面的问题1)
Visual Studio 2017 15.8.6
Xamarin.Forms 3.2.0.871581
Microsoft.Identity.Client 1.1.4-预览版
下面是App.cs中的字符串列表,以及我的B2C设置中的屏幕截图。任何帮助将不胜感激!
public static string Tenant = "myapp.onmicrosoft.com";
public static string ClientID = "d43c8xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
public static string PolicySignUpSignIn = "B2C_1_emailPolicy";
public static string PolicyEditProfile = "B2C_1_profileEditPolicy";
public static string PolicyResetPassword = "B2C_1_passwordResetPolicy";
public static string[] Scopes = { "https://myapp.onmicrosoft.com/api/read" };
public static string ApiEndpoint = "https://myapp.azurewebsites.net/tables/todoItem";
public static string AuthorityBase = $"https://login.microsoftonline.com/tfp/{Tenant}/";
public static string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";
public static string AuthorityEditProfile = $"{AuthorityBase}{PolicyEditProfile}";
public static string AuthorityPasswordReset = $"{AuthorityBase}{PolicyResetPassword}";