2016-07-26 9 views
0

У меня в настоящее время проблема с одним из моих приложений.Обновить Office365 Авторизованный токен с Javascript

Проблема заключается в том, что пользователь может держать страницу открытой в течение длительного периода времени, прежде чем вводить какие-либо данные, поэтому иногда, когда они вводят данные и нажимают кнопку отправки, они перенаправляются на o365 для аутентификации и, следовательно, теряют введенные данные.

У меня есть стандартная аутентификация, работающая для приложения. Однако я верю, что для этого мне нужно будет обновить токен в javascript при нажатии кнопки отправки и отправить этот токен методу api для доступа.

Возможно ли это, и кто-нибудь знает, как это сделать?

Это приложение MVC ASP.NET с использованием Owin O365 с Microsoft Azure AD.

Я не уверен, какая информация или фрагменты кода будут актуальны здесь, поэтому, если есть что-нибудь, что я могу предоставить, обратитесь к нам.

Я нашел несколько примеров получения токенов и т. Д. С угловыми, однако это не СПА и не использует угловые.

Большое спасибо заранее.

UPDATE

Я попытался получить маркер, используя Адал JS, используя следующий код, но он не кажется, признает AuthorizationContext (конфигурация) вызов:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/adal.min.js"></script> 

    $('#btnSubmit').on('click', function (e) { 
     e.preventDefault(); 
     CheckUserAuthorised(); 
    }); 

    function CheckUserAuthorised() { 
     window.config = { 
      instance: 'https://login.microsoftonline.com/', 
      tenant: '##################', 
      clientId: '###################', 
      postLogoutRedirectUri: window.location.origin, 
      cacheLocation: 'localStorage' 
     }; 
     var authContext = new AuthorizationContext(config); //THIS LINE FAILS 
     var user = authContext.getCachedUser(); 
     if (!user) { 
      alert("User Not Authorised"); 
      authContext.login(); 
     } 
     else { 
      alert('User Authorized'); 
     } 
    } 

Это дает следующее сообщение об ошибке в консоли:

'AuthorizationContext' is undefined

UPDATE

У меня нет однозначной ошибки. Это было потому, что я звонил AuthorizationContext, а не AuthenticationContext. Ошибка школьника. Однако теперь, когда я проверяю свойство пользователя контекста, он всегда равен нулю. И я не знаю, как это происходит, поскольку контекст инициализируется при загрузке страницы.

+0

В коде есть опечатка. Попробуйте изменить AuthorisationContext на AuthorizationContext. – n0m4d

+0

хорошее место и спасибо за это, но я до сих пор получаю сообщение об ошибке: 'AuthorizationContext undefined' – DaRoGa

+0

Где вы взяли этот образец кода? Другое дело: вместо передачи в AuthorizationContext config, передайте это как window.config, потому что config был определен в объекте window. – n0m4d

ответ

0

Существует недостаток шага в вашем коде, вот простой пример кода, надеюсь, это поможет вам:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.10/js/adal.min.js"></script> 

<body> 
<a href="#" onclick="login();">login</a> 
<a href="#" onclick="getToken()">access token</a> 
<a href="#" onclick="getUser()">get user</a> 
</body> 
<script type="text/javascript"> 
    var configOptions = { 
     tenant: "<tenant_id>", // Optional by default, it sends common 
     clientId: "<client_id>", 
     postLogoutRedirectUri: window.location.origin, 
    } 
    window.authContext = new AuthenticationContext(configOptions); 

    var isCallback = authContext.isCallback(window.location.hash); 
    authContext.handleWindowCallback(); 

    function getToken(){ 
     authContext.acquireToken("https://graph.microsoft.com",function(error, token){ 
      console.log(error); 
      console.log(token); 
     }) 
    } 
    function login(){ 
     authContext.login(); 
    } 
    function getUser(){ 
     var user = authContext.getCachedUser(); 
     console.log(user); 
    } 
</script> 

Пример кода от ответа No 'Access-Control-Allow-Origin' header with Microsoft Online Auth. Проблемы различны, но они находятся в одном и том же сценарии.

любая дополнительная забота, пожалуйста, не стесняйтесь, дайте мне знать.

+0

Thats большое спасибо, я попробую это сейчас. Что касается проблем с IE, то и для Edge, и это ограничивается только локальным хостом, поэтому при развертывании это не имеет значения, какой браузер? Как большинство моих пользователей, используйте IE или Edge? Еще раз спасибо – DaRoGa

+0

, есть ли способ получить токен/логин без перенаправления браузера на Microsoft? По сути, я пытаюсь сделать это, чтобы я не потерял данные, введенные на страницу, и я могу получить токен и передать его методу API в качестве параметра. Спасибо, – DaRoGa

+0

Мне жаль, если я наивна здесь, но я не вижу, как это работает, когда вы впервые загружаете страницу, authContext инициализируется, и в этот момент пользователь будет иметь значение null, поэтому логин необходим, прежде чем можно будет приобрести токен. для входа в систему он перенаправляет на microsoftonline для входа в систему и перенаправляет обратно на исходную страницу, после чего authContext повторно инициализируется, и пользователь снова будет пустым? или я что-то пропустил? – DaRoGa

0

Я нашел аналогичный example в Интернете, и ваша проблема, похоже, связана с объектом, который вы создаете.

Вместо

new AuthorizationContext(window.config); 

попробовать

new AuthenticationContext(window.config); 

код побежал просто отлично показывая, что пользователь не прошел проверку подлинности.

+0

привет, я тоже заметил это, я больше не получаю неопределенную ошибку, однако теперь пользователь всегда null, я передаю параметры и делаю if (! user) {authContext.login()} и т. д., но поскольку инстанцирование всегда выполняется при загрузке страницы, пользователь всегда имеет значение null. как я могу обойти это? – DaRoGa

+0

Когда вы передаете параметры URL-адресу и пытаетесь запустить его в браузере, получаете ли вы какой-либо ответ? – n0m4d

+0

Когда я вызываю .login(), браузер перенаправляет и возвращает id_token в URL-адресе в формате 'https: // localhost: 44300/Communication/Add # id_token = ey ............ . & session_state = ..... ' – DaRoGa