【问题标题】:Why isn't my Azure Mobile Service accepting the bearer token ADAL.js is sending it?为什么我的 Azure 移动服务不接受 ADAL.js 发送的不记名令牌?
【发布时间】:2015-05-28 18:05:52
【问题描述】:

我正在使用带有隐式流的 ADAL.js 对 AngularJS 应用程序进行身份验证,以便能够访问 Azure 移动服务 API。

我已经在AMS(azure mobile service)的Identity选项卡中设置了Azure AD的身份信息如下...

应用网址设置为:https://.azure-mobile.net/login/aad

客户端 ID 是在 Azure AD 中设置的应用程序的客户端 ID。

允许的租户是:.onmicrosoft.com

GET 请求中包含标头:Authorization: Bearer eyJ0eXAiOiJKV1Qi...

但是我收到了来自 AMS 的 401 响应。

我做错了什么或错过了什么?

更新: 看起来我必须通过 Azure AD access_token 调用 AMS 端点来获取 AMS 令牌。我得到了这样的回应:

{"code":401,"error":"错误:不支持使用 'windowsazureactivedirectory' 进行身份验证。"}

所以,我想我将不得不使用指定的服务定向登录 https://msdn.microsoft.com/en-us/library/azure/dn283952.aspx

也许有一天这将支持 javascript 后端。但是,我使用 AMS 做的越多,我就越应该使用 .net 后端。

更新 05/29

我将我的 AMS 更改为 .Net 后端,因此我可以使用客户端定向流。我正在使用以下代码:

client.login('aad', { "access_token": sessionStorage['adal.idtoken'] })
            .done(function (results) {
                alert("You are now logged in as: " + results.userId);
                sessionStorage.X_ZUMO_AUTH = results.mobileServiceAuthenticationToken;
            }, function (err) {
                alert("Error: " + err);
            });

但是,我收到了 401 响应。

更新:基于另一个 SO 问题,我在 Azure AD 中为客户端创建了第二个应用程序。我已将其设置为允许访问 API 应用程序。我还将我的代码更新为以下内容:

          adalService.acquireToken('<<AMS App Client ID>>')
            .then(function(token) {

                $http({
                        method: 'POST',
                        url: constants.apiBaseUrl + '/login/aad', 
                        data: { "access_token" : token },
                        headers: {
                            'X-ZUMO-APPLICATION': constants.appKey
                        }
                      }).                
                    success(function (data, status, headers, config) {
                        alert(data);
                    }).
                    error(function (data, status, headers, config) {
                        alert(data);
                    });                        
            });
    }

但是,我还是得到了 401。我也用移动 sdk 试过了,还是 401。

【问题讨论】:

  • 为了记录和完整性:1)发布的正确端点是/login/aad,而不是/login/windowsazureactivedirectory;但这仍然会返回一条明确的错误消息,即在这种情况下不允许发布访问令牌。 2) 使用 Mobile Service JS SDK 验证 AAD 用户时工作正常
  • 对,我能够让服务定向身份验证工作。 msdn.microsoft.com/en-us/library/azure/dn283952.aspx

标签: azure azure-mobile-services adal


【解决方案1】:

看来您的步骤正确。您能否看一下 Azure 网站上的操作方法,看看您是否遗漏了什么?可以分享一下你用来登录的客户端代码吗?

https://azure.microsoft.com/en-us/documentation/articles/mobile-services-html-how-to-use-client-library/#caching

【讨论】:

  • 谢谢,javascript 后端似乎不支持此功能。请参阅上面的更新。
  • 你是对的。 JavaScript 后端尚不支持客户端直接 AAD 登录。
  • 为什么克里斯为什么?任何支持这一点的计划。我看到 Javascript 后端 web api 应用程序甚至不在新门户中......他们会放弃这个吗?
  • 我们可能不会支持这一点,因为我们正在致力于移动服务的下一个发展——移动应用程序——并且我们所有的 Node 人员都在全力以赴。借助移动应用,我们与 Azure 网站的故事有了更好的联系,而且我们更容易发布新功能;所以对即将出现的一些新东西感到兴奋,但移动服务不太可能看到任何重大改进。不过,我们还没有制定任何停用它的计划,所以如果它符合您的情况,请随意使用它。如有任何问题/疑虑,请随时给我发电子邮件 - chrande (at) microsoft (dot) com。
  • 知道了。那么,新门户中的新移动应用是否等同于旧门户中的移动服务,但仅支持 .Net 后端?
【解决方案2】:

我怀疑 401 来自 ADAL.JS 提供的 ID 令牌在结构上与移动服务期望的访问令牌不同。移动服务中的客户端导向流是围绕原生移动平台的早期 ADAL 客户端构建的,它们具有可以呈现的完整访问令牌。

Mobile Servicer 在访问令牌中检查的主要内容之一是令牌的受众是 /login/aad 端点,但 ID 令牌并非如此。

根据我所看到的,我认为移动服务目前不支持 ADAL.JS。您似乎无法获得客户端导向流所需的访问令牌。最好的办法是使用服务器流,听起来你已经在工作了。

【讨论】:

  • 我错了 - 事实证明这是可行的,另一篇 SO 帖子证明了这一点:stackoverflow.com/questions/30642138/…
  • 是的,我正在执行所有这些步骤,但仍然收到 401。我不知道我做错了什么。
【解决方案3】:

由于另一位 SO 成员发布了一篇关于如何执行此操作的博客...

http://blogs.if-blueprint.de/svenor/2015/06/19/authenticate-azure-mobile-service-app-adal-js/

...指向一个链接,让我可以解决它。

我的问题是客户端 AAD 应用程序上的应用程序 ID url 不在 Azure Active Directory 上经过验证的域中。我正在使用https://mysite.azurewebsites.net

当我将其更改为域 https://mydomainname.onmicrosoft.com/myappname 中的 URL 时,它就像魔术一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2019-07-26
    • 1970-01-01
    • 2018-07-19
    • 2017-04-20
    • 2015-08-18
    相关资源
    最近更新 更多