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