为什么我的Azure移动服务不接受ADAL.js发送的承载令牌?

时间:2015-05-28 18:05:53

标签: azure azure-mobile-services adal

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

我已在AMS(天蓝色移动服务)的“身份”标签中设置了Azure AD身份信息,如下所示...

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

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

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

标头包含在GET请求中:授权:Bearer eyJ0eXAiOiJKV1Qi ...

但是我从AMS得到了401回复。

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

更新: 看起来我必须调用AMS端点传递Azure AD access_token以获取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。

3 个答案:

答案 0 :(得分:1)

看起来你正在遵循正确的步骤。你能看看如何在Azure的网站上看看你是否遗漏了什么?你能分享用来登录的客户代码吗?

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

答案 1 :(得分:1)

我怀疑401是因为ADAL.JS提供的ID令牌与移动服务所期望的访问令牌的结构不同。移动服务中的客户端定向流程是围绕早期针对本机移动平台的ADAL客户端构建的,并且这些客户端具有可以呈现的完全访问权限。

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

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

答案 2 :(得分:0)

由于另一位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中的网址时,它就像魔法一样工作。