Токен обновления MVC AD Azure через Adal JavaScript Ajax и KnockoutJs

в типе приложения MVC, которое я построил, есть врожденный недостаток дизайна, и я считаю, что я не первый, кто это понял.

У меня есть приложение MVC 4, которое использует проверку подлинности ad Azure, которая была введена в приложение следующим образом

разработка ASP.NET приложения с Azure Active Directory

один раз как пользователь аутентифицируется и Home.cshtml loads, KnockoutJs используется для выполнения JavaScript AJAX POST и получения запросов на чтение и запись данных.

таким образом, не совсем одностраничное приложение, а скорее сочетание традиционных обратных связей для аутентификации и обслуживания активов и операций чтения/записи через AJAX.

во время запросов AJAX токен аутентификации истекает, и AD не может обновить токен через JavaScript.

наблюдается следующая ошибка браузера

XMLHttpRequest не удается загрузить https://login.windows.net/xxx. Нет Заголовок "Access-Control-Allow-Origin" присутствует на запрашиваемом ресурсе. Поэтому Origin ' xxx ' не имеет доступа.

Я исследовал adal.js и следующие сообщения, но не уверен, что adal.JS-это решение для моего типа приложения или как лучше всего включить его, чтобы он работал с моим типом приложения.

мое понимание до сих пор:

Я не использую AngularJS.

Я не начинаю аутентификацию через JavaScript, и я мой аутентификация не управляется JavaScript, чтобы иметь возможность извлекать выгоду из adal.js.

аутентификация выполняется на стороне сервера, и последующий механизм токена обновления OAuth2 требует полной обратной связи страницы.

я наткнулся на различные выпущенные сообщения Витторио Берточчи, но ни один из них не касается особенностей этого типа дизайна приложений MVC.

Adal, Windows Azure AD и токены обновления нескольких ресурсов

WAAD не делает обновить маркер доступа из javascript

комбинирование ADAL.Net и Адал.js

AngularJS + ADAL.JS установить идентификатор ресурса (аудитория)

1 ответов


проблема с вашей настройкой заключается в том, что вы используете cookies для аутентификации вызовов AJAX. Cookies не очень хорошо подходят для этого, и ограничения подхода обычно возникают, когда вам нужно совершать звонки за пределами вашего домена и/или когда срок действия cookie истекает. Тот факт, что это общий подход, во многом как эволюционный шаг из-за того, что надлежащая поддержка SPA для auth не была доступна в течение некоторого времени, не делает его хорошим подходом. Вы вольны придерживаться своего течения подходите, но это причинит боль. Нет установленного механизма для запуска обновления cookie сеанса из JS. Хотя это можно взломать вместе, у нас нет образцов для этого - в основном потому, что это хак :) основной случай кажется достаточно простым, но как только вы начнете рассматривать все возможные случаи (что произойдет, если во время истечения срока действия вашего сеанса приложения пользователь вышел из Azure AD и вошел в другую учетную запись?). Самый надежный подход-отказаться от гибрида. подход. Если вы хотите быть приложением JS, вы можете устранить все серверные логины и сохранить возможность делать потоки на стороне сервера (через половину грантов, например https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet). Вам даже не нужно преобразовывать в угловой, если вы не хотите, см. https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet. И если вы хотите быть приложением на основе обратной передачи, вы можете удалить часть JS (хотя это звучит болезненный.)

TL;DR: защита вызовов AJAX через cookies не является чистым решением, и вы обязательно почувствуете боль. Ваш выбор - между исправлением проблем с помощью специальных хаков или рефакторингом в сторону более канонического подхода. Извините за плохие новости :(