【问题标题】:Xamarin Android App error when authenticating验证时 Xamarin Android 应用程序错误
【发布时间】:2019-12-10 11:03:14
【问题描述】:

我正在尝试向我的 Xamarin Android 应用程序添加身份验证。我使用以下内容作为指导:https://github.com/azure-samples/active-directory-xamarin-native-v2#integrate-microsoft-identity-and-the-microsoft-graph-into-a-xamarin-forms-app-using-msal

当我尝试从 Visual Studio 在 Android 模拟器中运行该示例时,它运行良好:它会弹出一个登录页面,完成后返回到应用程序。但是,当我尝试在我的应用程序中执行相同操作时,应用程序会中断外部代码(我在 Visual Studio 中看到“应用程序处于中断模式”页面)。

在下面的代码中,MainActivity 中的 OnActivityResult 被调用(我有一个断点),但是控制永远不会返回到 ContinuousScanPage 中 AcquireTokenInteractive 之后的行。

相关部分代码如下(为简洁起见,已删除无关代码):

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    protected async override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        App.ParentWindow = this;
        LoadApplication(new App());
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
    }
}

App.xaml.cs

public partial class App : Application
{
    private string _deviceId;

    public string DeviceId { get => _deviceId; internal set => _deviceId = value; }
    public IPublicClientApplication PCA { get; set; } = null;
    public static object ParentWindow { get; set; }
    public string AccessToken { get; set; }

    public App()
    {
        Settings settings = Settings.Get<Settings>();

        InitializeComponent();
        DeviceId = CrossDeviceInfo.Current.Id;

        PCA = PublicClientApplicationBuilder.Create(settings.AuthClientId)
            .WithRedirectUri($"msal{settings.AuthClientId}://auth")
            .Build();

        MainPage = new NavigationPage(new Pages.ContinuousScanPage(CaptureType.MusterIn));
    }
}

ContinuousScanPage.xaml.cs

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class ContinuousScanPage : ContentPage
{
    private readonly App _app;

    public CaptureType CaptureType { get; }

    public ContinuousScanPage(CaptureType captureType)
    {
        CaptureType = captureType;

        InitializeComponent();
        _app = (App)Application.Current;
     }

    public static bool IsPageFirstLoad = true;
    protected override async void OnAppearing()
    {
        if (IsPageFirstLoad)
        {
            IsPageFirstLoad = false;
            await SignIn();
            BindingContext = this;
        }

        base.OnAppearing();
    }

    private async Task SignIn()
    {
        Settings settings = Settings.Get<Settings>();

        AuthenticationResult authResult = null;
        IEnumerable<IAccount> accounts = await _app.PCA.GetAccountsAsync();
        try
        {
            IAccount firstAccount = accounts.FirstOrDefault();
            authResult = await _app.PCA.AcquireTokenSilent(settings.AuthScope, firstAccount).ExecuteAsync();
            await RefreshUserDataAsync(authResult.AccessToken);
        }
        catch (MsalUiRequiredException)
        {
            authResult = await _app.PCA.AcquireTokenInteractive(settings.AuthScope)
                .WithParentActivityOrWindow(App.ParentWindow)
                .ExecuteAsync();
            await RefreshUserDataAsync(authResult.AccessToken);
        }
    }

    public async Task RefreshUserDataAsync(string token)
    {
        _app.AccessToken = token;

    }
}

【问题讨论】:

    标签: c# android xamarin msal


    【解决方案1】:

    除了使用您的 clientId 和 redirectUri 更新应用程序之外,您还必须确保 Android 清单中包含以下内容:

    <activity android:name="microsoft.identity.client.BrowserTabActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="msal{client_id}" android:host="auth" />
             </intent-filter>
    </activity>
    

    android:scheme 中,您需要包含您的clientId。希望这能解决您的问题(将清单中的 client_id 替换为您自己的)

    【讨论】:

    • 实际上,我确实有这个:我只是为了简洁而没有包括它
    • @JeffHornby 我刚刚尝试了带有最新版本 MSAL 的示例,但没有遇到同样的问题。我也使用了我自己的租户,试图复制你正在做的事情,但没有遇到同样的问题。可以提供日志吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多