Azure AD (ADAL) 登录屏幕在 Android 中仅在设备方向上丢失输入的用户电子邮件 - XamarinForms.Android

Azure AD (ADAL) Login Screen Loses Entered User Email on Device Orientation in Android Only-XamarinForms.Android

我有 Xamarin.Forms 应用程序使用 ADAL (Microsoft.IdentityModel.Clients.ActiveDirectory) 根据 Azure AAD 对用户进行身份验证。一切正常,但在 Android 上,设备方向会在 Microsoft 身份验证屏幕上丢失用户电子邮件。

这里是竖屏模式,我输入了用户邮箱:

单击“下一步”会出现要求输入密码的屏幕。如果我现在在 Android 上旋转设备,它将 return 我回到上面的空白屏幕,我在上面输入的用户电子邮件丢失了:

设备轮换不应 return 用户返回并再次提示用户电子邮件。它应该停留在密码提示上。

如何防止轮换重新提示输入用户电子邮件?我不想禁用轮换,我只是想阻止它 return 再次将我带回提示用户电子邮件的屏幕。

这是 Xamarin.Forms 应用程序,我的 MainActivity 已经有 ConfigChages.Orientation 属性,如下所示;但是,这并不能解决问题:

[Activity(Name = "my.mainactivity"
, Label = "MyApp"
, Icon = "@drawable/icon"
, ConfigurationChanges = ConfigChanges.ScreenSize 
    | ConfigChanges.SmallestScreenSize 
    | ConfigChanges.ScreenLayout 
    | ConfigChanges.Orientation)]
public class MainActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
   ...
}

更新

即使我在调用 AcquireTokenAsync 之前冻结纵向方向并在调用收到响应后将其解冻,它的行为仍然相同 - 即使我将其父级 (MainActivity) 冻结为纵向,它仍会旋转 Microsoft 登录页面(这是 PlatformParameters 中传递给调用 AcquireTokenAsync 的所有者。因此,我的 activity 保持纵向,但该登录页面仍然旋转并丢失数据。微软在 AcquireTokenAsync 内部使用的 WebView 似乎没有遵循activity 上的方向设置在 PlatformParameters 内部传递给 AcquireTokenAsync。

微软确认这是他们的内部问题。如果您在 Android 上也 运行 遇到此问题,其中设备轮换 return 让您返回提示输入用户电子邮件,您可以在此处跟进 ADAL 和 MSAL 的修复进度:

https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/issues/1622 https://github.com/xamarin/xamarin-android/issues/3326

我身边用的是Entry,添加ConfigurationChanges = ConfigChanges.ScreenSize| ConfigChanges.Orientation,效果很好

如果您仍然遇到此问题,我建议您可以按照以下步骤操作:

1.on 表单 PCL,您可以覆盖 OnSizeAllocated 以检查屏幕方向,如下所示:

How to detect screen orientation of the device in Xamarin.Forms?

2.On表单PCL和Android,可以使用MessageCener订阅和发送数据

3.override 方法 onSaveInstanceState() 和 onRestoreInstanceState(),像这样:

Handle screen rotation without losing data - Android

此问题已在 ADAL Release 5.1.1 中修复,并将包含在下一版本的 MSAL(很可能是 4.3.1)中。

此问题是由微软的 ADAL 组件Microsoft.IdentityModel.Clients.ActiveDirectory引起的,已在几周前发布的 5.1.0 版本中修复(当前版本为 5.2.0)。

为了解决这个问题,我必须做的是: 1.将ADAL从3.19.8更新到5.2.0(5.1.0以下的都有这个问题) 2. 然后将传递给 AuthenticationContext c-tor 的 AuthorityURL 从 https://login.microsoftonline.com/my-tenant-id/oauth2/authorize 修改为 https://login.microsoftonline.com/my-tenant-id

尽管 Microsoft 在大多数地方声称更改是非破坏性更改(他们确认这是必要的),但第 2 条是必要的。

在此之后,我能够像以前一样进行身份验证,但是 Android 上的轮换不会丢失已经提供的用户 ID and/or 密码。