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



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

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

应用url设置为: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。

看起来您的步骤是正确的。你能不能看看Azure网站上的操作指南,看看你是否遗漏了什么?您能分享一下您登录时使用的客户端代码吗?

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

我怀疑401来自这样一个事实,即ADAL.JS呈现的ID令牌在结构上与移动服务期望的访问令牌不同。移动服务中的客户端定向流是围绕本地移动平台的早期ADAL客户端构建的,这些客户端可以提供完整的访问令牌。

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

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

由于另一个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然后它就像魔术一样工作

最新更新