在 Xamarin Forms 项目中使用 AAD 和 Google 的 Azure 身份验证在授权后未重定向回应用程序

Posted

技术标签:

【中文标题】在 Xamarin Forms 项目中使用 AAD 和 Google 的 Azure 身份验证在授权后未重定向回应用程序【英文标题】:Azure Authentication with AAD & Google in a Xamarin Forms Project not Redirecting back to app after Authorized 【发布时间】:2018-07-07 12:22:42 【问题描述】:

Azure 活动目录

Google+ 身份验证

Xamarin 表单,PCL (NuGet 2.4.0.282)

Microsoft.Azure.Mobile.Client 4.0.0 & 4.0.2

成功登录后,我的手机无法返回我的应用程序。我有两部测试手机和一个模拟器,它们在登录后显示不同的信息。

电话 1(AAD 身份验证):

电话 1(Google Auth 显示为灰色并一直“加载”)

电话 2(AAD 和 Google 身份验证):

模拟器(AAD 和 Google 身份验证):

我已经完成了我在 Stack OverFlow 上找到的所有内容,这很有意义,并且似乎适用于当前版本的 NuGet。 此人似乎与我有类似的问题,但使用 Google 登录 Azure not redirecting after loginenter link description here

我尝试将代码集成到我的项目中。然后我将我的 Azure 信息输入到 Xamarin 的示例中:https://github.com/xamarin/xamarin-forms-samples/tree/master/WebServices/TodoAzureAuth

我得到了相同的结果。我已经尝试过 AAD 和 Google+ 身份验证。登录后它只停留在浏览器中。所以我觉得客户端代码必须是正确的。但是我在我的 Azure 服务器代码上找不到任何混乱。我已经对具有 C# 和 Node.Js 后端的项目进行了尝试。(对于我的一个项目)我允许的外部重定向 URL 是 ToDoList53172://easyauth.callback,在我的 androidManifest.xml 中看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.sample.TodoAzure">
    <uses-sdk android:minSdkVersion="15" />
    <application android:label="TodoAzure" android:icon="@drawable/icon">
        <activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true">
            <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="ToDoList53172" android:host="easyauth.callback" />
            </intent-filter>
        </activity>
    </application>
</manifest>

旧: 而且我觉得我不应该发布所有其他代码。这一切都在上面发布的 Xamarin 示例项目中。如果人们认为我应该这样做,我会的。 新的: 我添加更多代码只是为了帮助人们。我不想超载,但最好将所有信息放在一个地方。所以这是我的 MainActivity.cs 代码

using System;
using System.Threading.Tasks;
using Android.App;
using Android.Content.PM;
using Android.OS;
using Microsoft.WindowsAzure.MobileServices;
using Android.Webkit;

namespace TodoAzure.Droid

    [Activity(Label = "TodoAzure.Droid",
        Icon = "@drawable/icon",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        Theme = "@android:style/Theme.Holo.Light")]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity, IAuthenticate
    
        MobileServiceUser user;

        protected override void OnCreate(Bundle bundle)
        
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init();
            App.Init((IAuthenticate)this);
            LoadApplication(new App());
        

        public async Task<bool> AuthenticateAsync()
        
            bool success = false;
            try
            
                if (user == null)
                
                    // The authentication provider could also be Facebook, Twitter, or Microsoft
                    user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.Google, Constants.URLScheme);
                    if (user != null)
                    
                        CreateAndShowDialog(string.Format("You are now logged in - 0", user.UserId), "Logged in!");
                    
                
                success = true;
            
            catch (Exception ex)
            
                CreateAndShowDialog(ex.Message, "Authentication failed");
            
            return success;
        

        public async Task<bool> LogoutAsync()
        
            bool success = false;
            try
            
                if (user != null)
                
                    CookieManager.Instance.RemoveAllCookie();
                    await TodoItemManager.DefaultManager.CurrentClient.LogoutAsync();
                    CreateAndShowDialog(string.Format("You are now logged out - 0", user.UserId), "Logged out!");
                
                user = null;
                success = true;
            
            catch (Exception ex)
            
                CreateAndShowDialog(ex.Message, "Logout failed");
            

            return success;
        

        void CreateAndShowDialog(string message, string title)
        
            var builder = new AlertDialog.Builder(this);
            builder.SetMessage(message);
            builder.SetTitle(title);
            builder.SetNeutralButton("OK", (sender, args) =>  );
            builder.Create().Show();
        
    

就像我上面所说的,我也尝试过使用 AAD。上面的代码适用于 Google。

这是我的 Azure 身份验证设置

这是我使用“https://todolistjbb.azurewebsites.net/.auth/login/aad”登录然后访问后得到的信息 “https://todolistjbb.azurewebsites.net/.auth/me”

我觉得我尝试了很多东西。我已经记录了 66.68 小时的工作,只是试图在我的应用程序中获得身份验证......请......有人告诉我我做错了什么!我在这里丢了它:'(

【问题讨论】:

【参考方案1】:

解决这个问题的方法是不要在你的 Url Scheme 中以大写字母开头。我花了两个多星期才弄明白。我不认为这个姐姐写在任何地方,但我相信它是。 所以是的,为了解决这个问题,我将“ToDoList53172”切换为“todolist53172” 就是这样...哎呀!

【讨论】:

哥们,你在 2020 年救了我的命!给我你的地址,我送你一枚金牌:)【参考方案2】:

根据您的描述,我假设您使用的是Azure App Service authentication/authorization提供的Server-managed authentication。由于您使用的是 Microsoft.Azure.Mobile.Client >= 4.0.0,因此对于您的移动客户端,您可以利用以下代码 sn-p 通过服务器流进行日志记录:

var user = await client.LoginAsync(this, provider, "url_scheme_of_your_app");

您可以关注Add authentication to the app 的详细信息。此外,您需要Add your app to the Allowed External Redirect URLs。

根据您手机的错误信息 2:

tod​​olistjbbservice://easyauth.callback/#authorization_code=xxxxx

您似乎没有正确配置 授权重定向 URI。对于 Azure Active Directory 提供程序,您可以按照 here 注册您的 Web 应用程序/API 或本机应用程序。对于 Google 提供商,您可以关注 here。

正确配置首选身份提供商后,您需要将应用添加到允许的外部重定向 URL:

登录 Azure 门户,选择您的应用服务 点击认证/授权, 在 Allowed External Redirect URLs 中输入 ToDoList53172://easyauth.callback,然后保存您的更改。

【讨论】:

感谢您的回复。我知道我发布了大量信息,但在其中我确实说我已经将允许的外部重定向 URL 设置为 ToDoList53172://easyauth.callback “我允许的外部重定向 URL 是 ToDoList53172://easyauth.callback 并且在我的 AndroidManifest .xml 看起来像这样:”我没有列出 MainActivity.cs 的代码,因为这正是我的链接中的示例项目。但是是的,我的 LoginAsync 看起来和你写的完全一样。我将使用我的设置的更多屏幕截图来编辑我的帖子。对不起,我不想写一个超长的帖子。 您的移动后端正在尝试将用户重定向到todolistjbbservice://easyauth.callback/#authorization_code=xxxxx。由于您已经配置了允许的外部重定向 URL,我假设您需要按照我的答案中的 Authorized Redirect URI 部分并按照教程检查 Redirect URI 当您配置您的登录提供商。 抱歉。那个截图只是我的很多很多尝试之一。那是当时正确的授权重定向 URI。明天我会更新截图以显示更新的截图。但是只要知道todolistjbbservice注册为todolistjbbservice://easyauth.callback。我已经记不清我做了多少个版本,我的照片涵盖了所有版本。很抱歉混淆了 为了一个简单的方法,我建议您直接通过浏览器访问https://your-app-name.azurewebsites.net/.auth/login/provider-name e.g google or aad 并尝试检查您的登录提供程序是否已成功配置。登录后,您可以访问https://your-app-name.azurewebsites.net/.auth/me 检索您登录的用户信息。 是的,我也这样做了。我觉得我已经学习了很多教程,阅读了很多论坛帖子。这是结果。如果所有网址不匹配,再次抱歉。我正在从项目的一个版本中获取所有屏幕截图。 ScreenShot of .auth/me page

以上是关于在 Xamarin Forms 项目中使用 AAD 和 Google 的 Azure 身份验证在授权后未重定向回应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 手势密码实现

添加对 Xamarin.Forms 的项目引用

我是 xamarin 的新手,想在我的 xamarin.forms 项目中实现对话框

Xamarin.forms如何在列表中显示彼此相邻的项目

在 Xamarin.Forms 中创建 UI 元素

在 Xamarin.Forms 中使用 Android 绑定