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

时间:2018-01-28 19:40:13

标签: android azure authentication xamarin.forms azure-mobile-services

Azure Active Directory

Google+身份验证

Xamarin Forms,PCL(NuGet 2.4.0.282)

Microsoft.Azure.Mobile.Client 4.0.0& 4.0.2

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

电话1(AAD Auth): enter image description here

电话1(谷歌认证它灰色,只是保持“加载”) enter image description here

电话2(AAD和Google Auth): enter image description here

模拟器(AAD和Google Auth): enter image description here

我已经完成了我在Stack OverFlow上找到的所有内容,这很有意义,似乎适用于当前版本的NuGets。 这个人似乎对我有类似的问题,但谷歌登录 Azure not redirecting after login enter link description here

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

我得到了同样的结果。我尝试了AAD和Google+ Auth。登录后,它只会停留在浏览器上。所以我觉得客户端代码必须是正确的。但是我无法在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>

OLD: 而且我不觉得我应该发布所有其他代码。这完全在上面发布的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 Auth设置 enter image description here

以下是使用“https://todolistjbb.azurewebsites.net/.auth/login/aad”登录后访问的信息 “https://todolistjbb.azurewebsites.net/.auth/meenter image description here

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

2 个答案:

答案 0 :(得分:0)

根据您的说明,我假设您使用Server-managed authentication提供的Azure App Service authentication/authorization。由于您使用的是Microsoft.Azure.Mobile.Client&gt; = 4.0.0,因此您可以利用以下代码段通过服务器流进行日志记录:

q = w.query('subscribe', '/tmp/z', 'Buffy', 
            {"since": clock,
             "fields": ["name", "exists", "oclock",
                        "ctime_ns", "new", "mode"]})

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

根据手机2的错误消息:

  

todolistjbbservice://easyauth.callback/#authorization_code=xxxxx

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

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

  • 登录Azure Portal,选择您的App Service
  • 点击身份验证/授权, 在允许的外部重定向网址中输入var user = await client.LoginAsync(this, provider, "{url_scheme_of_your_app}"); ,然后保存更改。

答案 1 :(得分:0)

解决此问题的方法是不要以Url Scheme的大写字母开头。我花了两个多星时间来搞清楚。我不认为这是在任何地方写的,但我确信它是。 所以是的,为了解决这个问题,我将“ToDoList53172”切换为“todolist53172” 就是这样...... Oy vey!