Cordova AAD 服务器流身份验证在 Android 和 iOS 上挂起

Posted

技术标签:

【中文标题】Cordova AAD 服务器流身份验证在 Android 和 iOS 上挂起【英文标题】:Cordova AAD server flow authentication hangs on Android and iOS 【发布时间】:2016-11-29 07:12:23 【问题描述】:

我已经尝试解决这个问题一个多星期了,但没有任何进展。我在使用 Cordova Azure 移动应用插件和 .NET/C# 后端进行身份验证时遇到问题。

我正在关注这个tutorial 为 android/ios 创建一个 Cordova 应用程序。我添加了 Azure Active Directory 作为我的身份验证提供程序,基于此tutorial。我从 Azure Portal for Cordova 和 .NET/C# 后端下载了快速入门项目。

我部署了 Azure 移动应用后端并更新了资源浏览器以允许 https://localhost:4000 和 https://myazurewebsite.azurewebsites.net,方法是在 allowedExternalRedirectUrls 中添加 URL。我还更新了 CORS 以允许使用相同的 URL。我将我的单点登录回复 URL 添加为 https://myazurewebsite.azurewebsites.net/.auth/login/aad/callback。我确保我的 Cordova 应用程序安装了 InAppBrowser 和 Azure Mobile Apps 插件。我更新了 Content-Security-Policy 以指向 https://login.windows.net 和 https://myazurewebsite.azurewebsites.net。我将 onDeviceReady() 函数更新为:

function onDeviceReady() 

    // Create a connection reference to our Azure Mobile Apps backend
    client = new WindowsAzure.MobileServiceClient('https://myazurewebsite.azurewebsites.net');

    // Login to the service
    client.login('aad')
        .then(function () 

            // BEGINNING OF ORIGINAL CODE

            // Create a table reference
            todoItemTable = client.getTable('todoitem');

            // Refresh the todoItems
            refreshDisplay();

            // Wire up the UI Event Handler for the Add Item
            $('#add-item').submit(addItemHandler);
            $('#refresh').on('click', refreshDisplay);

            // END OF ORIGINAL CODE

        , handleError);

当我在 Ripple 中执行 Cordova 应用程序时,连接到我的工作 LAN,应用程序加载到 Ripple 中,然后打开第二个窗口,询问我的 AAD 凭据。我输入我的用户名,关闭标签,然后重定向开始发生,我成功通过身份验证并能够与教程中的 ToDoItem 交互。

当我在 Ripple 中执行 Cordova 应用程序时连接到 公共网络,应用程序加载到 Ripple 中,然后打开第二个窗口,询问我的 AAD 凭据。我输入我的用户名,关闭标签,然后重定向开始发生,我看到了如下图所示的附加提示:

当我执行 Cordova 应用程序并将其发送到 Android 或 iOS 设备时连接公共网络,我收到 Cordova WebView (InAppBrowser),它要求我的凭据。我输入我的用户名,按密码文本框,然后重定向开始。然后它只是转到一个空白的白色页面并挂在那里。

我错过了什么吗?为什么我在连接到公共网络时在 Ripple 中收到第二个提示,为什么 Cordova WebView 在尝试仅验证用户名后显示空白屏幕?

Azure 移动应用 CORS 设置:

Azure 移动应用 AAD 身份验证设置

Azure 资源浏览器设置:

Express 设置 Active Directory 管理模式创建的 Azure Active Directory WebApp 委托权限集是默认的:登录并阅读用户配置文件

【问题讨论】:

【参考方案1】:

看起来公共网络设置在代理上。然后,您正在代理一个代理,而后端看不到它期望的 URL - 相反,它看到的是代理的 URL。

我怀疑这是在“正常”移动情况下可以正常工作的事情之一。当您在公共网络上时,请在真实设备上运行应用程序。

【讨论】:

阿德里安,感谢您的回复。我希望你会!不幸的是,您的建议似乎不起作用。我将该应用程序部署到我的个人三星 Galaxy S5 设备上,将其与 WiFi 断开连接(所以我使用的是 4G LTE)并且我得到了相同的行为。我该如何进一步调试它?还有其他建议吗? 鉴于它在内部而不是外部工作,它必须是网络。您已排除应用程序和设置。我会问 IT 人员是否设置了任何会影响此的权限 谢谢阿德里安!我在我的个人 Azure 实例上对其进行了测试,一切都按预期工作,所以这绝对与我的公司 Azure/Fed 设置有关。一旦我们的 IT 人员调查了它,当我发布问题时,我也会在此处和 MSDN 中发布答案。【参考方案2】:

问题是我的公司通过 Azure 将 Azure AD 身份验证请求发送到我们的本地 ADFS 服务器。我们公司的基础设施组需要在中间添加一个 WAP(Web 应用程序代理)服务器来拦截通信并允许此流程工作。

一旦他们添加了 WAP 服务器,就不再是问题了。

【讨论】:

以上是关于Cordova AAD 服务器流身份验证在 Android 和 iOS 上挂起的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 应用服务身份验证与身份验证(经典)中重定向以使用 AAD 登录

Azure Kubernetes 服务中的 AAD 身份验证

在移动应用中使用 AAD 自定义登录验证 Azure 应用服务

在 Asp.Net Core Web 应用程序中使用 EasyAuth 对 Azure 应用服务上的 AAD 进行身份验证时,无法填充 ClaimsPrincipal

使用 Azure Active Directory 客户端凭据流控制身份验证令牌的到期

Azure 点到站点 - AAD 身份验证