如何从Cordova Azure认证的应用程序

时间:2016-03-14 15:29:02

标签: cordova azure authentication asp.net-web-api adal

我为ios / android构建了一个VS2015 Cordova应用程序。该应用程序使用与此Microsoft Azure tutorial之后的Azure Active Directory绑定的Azure移动服务。这很好用。当我尝试进行目录搜索时,Azure会提示我使用我的租户凭据进行身份验证。

后续步骤:

  1. 我创建了一个Azure Web API,它在Azure SQL数据库上执行一些C.R.U.D。 API工作正常,我通过导航到 https:// [MyUniqueApi] .azurewebsites.net / api / values 来获取数据(虽然不安全)。
  2. 然后我使用下面的屏幕截图为Azure中的Web API启用了身份验证。 enter image description here启用后,我现在收到一个Microsoft登录页面,要求我对Web API进行身份验证,这很棒,而且我期望发生这种情况。

  3. 现在,我希望我的Cordova应用程序能够无缝(被动)向Azure Active Directory进行身份验证(已经发生),并允许我访问我的Web API并返回数据。关注此{{ 3)},在Classic Azure管理门户中,我将Cordova Native客户端应用程序配置为具有对我的Web API的权限。 Microsoft Azure tutorial 在本教程之后,我更新了Web API清单,将 oauth2AllowImplicitFlow 设置为 true ,并为Web API创建了一个密钥。enter image description here

  4. 一旦用户使用ADAL Cordova库进行了身份验证(工作正常并且我收到了令牌),我想对我的Web API执行GET请求并返回数据。

    这是我遇到问题的地方,并且不确定如何构建对API的请求,因此它会传递令牌/凭据以从API返回数据,而无需进一步登录。以下是我成功验证Azure Active Directory后的内容: enter image description here

    我尝试将ADAL返回的持有者令牌传递给jQuery GET请求的标头,但这不起作用。 jQuery完成回调中的 data 变量(来自上面的屏幕截图)在返回时包含HTML。在检查HTML时,它是Microsoft Azure登录页面,这意味着我没有获得被动身份验证流程。

    非常感谢任何帮助!我假设我没有正确构建jQuery,或者没有正确传递令牌或者信息,但找不到如何完成的示例这用javascript。我认为我的Azure设置很好,但可以添加帮助诊断问题所需的任何进一步信息的示例。

    @vibronet 我非常希望你能回答我的问题。谢谢你这样做!我确实按照你指出的cordova样本。这是我的出发点的基础。根据您的建议,我更改了我的Azure Web API清单并将隐式流程设置回false,我最初将其设置为true。如何使用/共享相同的accessToken查询图形api和我的web api?在index.js文件中(来自github示例),app.requestData函数使用authResult中的accessToken。此authResult来自获取资源“enter image description here”的令牌。我现在想使用相同的accessToken来从我的Web API获取数据,该数据位于“https://graph.windows.net”。我无法做到这一点,并在xhr响应中收到HTML。

    我在https://mywebapi.azurewebsites.net中有一个例子。这将工作并从图表api获取数据,但不会从 webApiResourceUri 的资源获取数据。如果我对Web API和图形API 单独进行身份验证并获得单独的accessTokens,它可以工作,但会设置两个登录屏幕。这就是为什么jsFiddle在两个不同的函数中验证了GraphApi和authenticateWebApi,因为我不明白如何组合和使用相同的令牌。

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

Arthur,您不需要隐式流程,也不需要密钥来调用您的Web API。请参阅Azure AD cordova示例here,特别是https://github.com/Azure-Samples/active-directory-cordova-multitarget/blob/master/DirSearchClient/js/index.js

更新以解决问题的第2部分:您永远不会使用相同的访问令牌来访问两个不同的资源。获得第一个访问令牌后,ADAL还获得了一个刷新令牌 - 可用于静默获取您应用声明为必需资源的其他资源的新访问令牌。您可以通过调用AcquireTokenSilent

来避免第二次登录屏幕