Почему моя мобильная служба Azure не принимает маркер носителя, который отправляет ADAL.js?

Я использую ADAL.js с неявным потоком для аутентификации приложения AngularJS, чтобы получить доступ к API мобильных служб Azure.

Я настроил информацию об удостоверении Azure AD на вкладке «Идентификация» AMS (мобильная служба Azure) следующим образом...

URL-адрес приложения: https://‹>.azure-mobile.net/login/aad.

Идентификатор клиента — это идентификатор клиента из приложения, настроенного в Azure AD.

Допустимый арендатор: ‹>.onmicrosoft.com.

Заголовок включен в запрос GET: Авторизация: Bearer eyJ0eXAiOiJKV1Qi...

Но я получаю ответ 401 от AMS.

Что я делаю неправильно или упускаю?

ОБНОВЛЕНИЕ. Похоже, мне придется позвонить в конечную точку AMS, передав access_token Azure AD, чтобы получить токен AMS. И получаю такой ответ:

{"код":401,"ошибка":"Ошибка: аутентификация с помощью "windowsazureactivedirectory" не поддерживается."}

Итак, я думаю, мне придется использовать вход в систему, направленный на службу, как указано https://msdn.microsoft.com/en-us/library/azure/dn283952.aspx

Возможно, когда-нибудь это будет поддерживаться для серверной части javascript. Но чем больше я работаю с AMS, тем больше мне кажется, что я должен был использовать серверную часть .net.

ОБНОВЛЕНИЕ 29.05

Я изменил свой 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.


person PilotBob    schedule 28.05.2015    source источник
comment
для записи и полноты: 1) правильной конечной точкой для публикации является /login/aad, а не /login/windowsazureactivedirectory; но все же это возвращает явное сообщение об ошибке, что POSTing токен доступа не разрешен в этом случае. 2) при использовании Mobile Service JS SDK аутентификация пользователя AAD работает корректно   -  person Massimo Prota    schedule 29.05.2015
comment
Правильно, я смог заставить работать аутентификацию, направленную на службу. msdn.microsoft.com/en-us/library/azure/dn283952. aspx   -  person PilotBob    schedule 29.05.2015


Ответы (3)


Похоже, вы делаете правильные шаги. Не могли бы вы взглянуть на инструкции на веб-сайте Azure, чтобы узнать, не пропустили ли вы что-нибудь? Не могли бы вы поделиться кодом клиента, который вы используете для входа?

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

person Chris Anderson-MSFT    schedule 28.05.2015
comment
спасибо, похоже, это не поддерживается бэкэндом javascript. Смотрите мое обновление выше. - person PilotBob; 28.05.2015
comment
Ты прав. Серверная часть JavaScript еще не поддерживает прямой вход клиента в AAD. - person Chris Anderson-MSFT; 29.05.2015
comment
Почему Крис, почему? Любые планы по поддержке этого. Я вижу, что серверных веб-API-приложений Javascript даже нет на новом портале... они собираются отказаться от этого? - person PilotBob; 29.05.2015
comment
Мы, скорее всего, не будем поддерживать это, потому что мы работаем над следующей эволюцией мобильных сервисов — мобильными приложениями — и все наши разработчики Node работают над этим в полную силу. Благодаря мобильным приложениям у нас есть лучшая связь с веб-сайтами Azure, и мы НАМНОГО проще выпускаем новые функции; так что будьте в восторге от появления некоторых новых вещей, но мобильные службы вряд ли увидят какие-либо радикальные улучшения. Тем не менее, мы до сих пор не планировали отказываться от него, поэтому не стесняйтесь использовать его, если он соответствует вашему сценарию. Не стесняйтесь обращаться ко мне по электронной почте с любыми вопросами/проблемами - chrande (at) microsoft (dot) com. - person Chris Anderson-MSFT; 29.05.2015
comment
понятно. Итак, является ли новое мобильное приложение на новом портале эквивалентом мобильного сервиса на старом портале, но с поддержкой только серверной части .Net? - person PilotBob; 29.05.2015
comment
Правильно. Серверная часть Node.js находится в разработке прямо сейчас, плюс вероятны небольшие изменения пользовательского интерфейса портала. - person Chris Anderson-MSFT; 29.05.2015
comment
Хорошо, я перешел на серверную часть .Net, чтобы использовать клиентский поток... Я могу получить указанную ошибку. Есть идеи? - person PilotBob; 29.05.2015
comment
Давайте продолжим обсуждение в чате. - person Chris Anderson-MSFT; 29.05.2015

Я подозреваю, что 401 происходит из-за того, что ADAL.JS представляет токен идентификатора, структура которого отличается от токена доступа, ожидаемого мобильными службами. Направленный клиентом поток в мобильных службах был построен на более ранних клиентах ADAL для собственных мобильных платформ, и они имеют маркеры полного доступа, которые они могут представлять.

Одна из основных вещей, которую Mobile Servicer проверяет в токене доступа, заключается в том, что аудитория токена — это конечная точка /login/aad, но это не относится к токенам ID.

Основываясь на том, что я вижу, я не думаю, что ADAL.JS поддерживается мобильными службами в настоящее время. Не похоже, что вы можете получить токен доступа, необходимый для потока, управляемого клиентом. Лучше всего использовать серверный поток, который, похоже, у вас работает.

person mattchenderson    schedule 08.06.2015
comment
Я ошибся здесь - оказывается, это выполнимо, о чем свидетельствует другой пост SO: stackoverflow.com/questions/30642138/ - person mattchenderson; 08.06.2015
comment
Да, я выполняю все эти шаги и все еще получаю 401. Я понятия не имею, что я делаю неправильно. - person PilotBob; 08.06.2015

Из-за другого члена SO, который разместил блог о том, как сделать именно это...

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

... который указывал на ссылку, которая позволила мне решить эту проблему.

Моя проблема заключалась в том, что URL-адрес идентификатора приложения в клиентском приложении AAD не находился в проверенном домене в Azure Active Directory. Я использовал https://mysite.azurewebsites.net.

Когда я изменил его на URL-адрес, который находился в домене https://mydomainname.onmicrosoft.com/myappname тогда это просто сработало как по волшебству.

person PilotBob    schedule 19.06.2015