为什么我的 Azure 移动服务不接受不记名令牌 ADAL.js 正在发送它?

Why isn't my Azure Mobile Service accepting the bearer token ADAL.js is sending it?

我正在使用 ADAL.js 和隐式流程来验证 AngularJS 应用程序,以便能够访问 Azure 移动服务 API。

我已经在 AMS(Azure 移动服务)的“身份”选项卡中设置了 Azure AD 身份信息,如下所示...

应用 url 设置为:https://<>.azure-mobile.net/login/aad

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

允许的租户是:<>.onmicrosoft.com

GET请求中包含header:授权:Bearer eyJ0eXAiOiJKV1Qi...

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

我做错了什么或遗漏了什么?

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

{"code":401,"error":"Error: Authentication with 'windowsazureactivedirectory' is not supported."}

所以,我想我将不得不按照指定的方式使用服务定向登录 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。

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

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

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

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

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

由于另一位 SO 成员发布了一篇关于如何做这件事的博客...

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

...它指向一个 link 让我解决它。

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

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