6

我已經構建的MVC應用程序類型存在固有的設計缺陷,我相信我不是第一個意識到的。MVC AD Azure Refresh令牌通過ADAL JavaScript Ajax和KnockoutJs

我有一種利用被引入到應用程序以下列方式

Developing ASP.NET Apps with Azure Active Directory

一旦爲用戶被認證和Home.cshtml負載,KnockoutJs用於執行的JavaScript AJAX AD天青認證的MVC 4應用POST和GET請求讀取和寫入數據。

因此,不完全是一個單頁面應用程序,而是通過AJAX進行身份驗證和服務資產以及讀/寫操作的傳統回傳混合。

在AJAX請求期間,身份驗證令牌到期並且AD無法通過JavaScript刷新令牌。觀察

以下瀏覽器錯誤

的XMLHttpRequest不能加載https://login.windows.net/xxx。 請求的資源上沒有「Access-Control-Allow-Origin」標題。 原因'xxx'因此不被允許訪問。

我已經研究adal.js及以下職位,但不能肯定是否adal.js是解決我的應用程序類型 或如何最好地將它,使之與我的應用程序類型的工作。

我到目前爲止的理解:我不使用AngularJS

我沒有開始通過JavaScript進行身份驗證,我的身份驗證不是JavaScript驅動的,無法從adal.js中受益。

服務器端完成身份驗證,隨後的OAuth2刷新令牌機制需要完整頁面回發。

我已經無意中發現了Vittorio Bertocci的各種相關帖子,但沒有提到這種類型的MVC應用程序設計的特殊性。

ADAL, Windows Azure AD and Multi-Resource Refresh Tokens

WAAD doesn't refresh access token from javascript

Combining ADAL.Net and ADAL.js

AngularJS + ADAL.JS set Resource ID (Audience)

回答

8

您的設置的問題是,您使用的cookie進行驗證AJAX調用。 Cookie並不適合這種情況,當您需要在域外撥打電話和/或cookie過期時,方法的侷限性通常會顯現出來。事實上,這是一種常見的方法,很大程度上是作爲一個漸進的步驟,因爲適當的SPA對auth的支持在一段時間內不可用,這並不是一個好方法。 你可以自由地堅持你目前的做法,但那會造成一些痛苦。沒有建立從JS觸發會話cookie更新的機制。儘管可以一起入侵,但我們沒有這方面的示例 - 主要是因爲它是一種黑客攻擊:)基本案例看起來很簡單,但只要您開始考慮所有可能的案例(如果您的應用會話過期,用戶從Azure AD註銷並使用其他帳戶登錄?)。最簡單的方法是放棄混合方法。如果你想成爲一個JS應用程序,你可以消除所有的服務器驅動的登錄,並仍然保留做服務器端流程的能力(通過諸如https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet之類的贈款)。如果您不想要,甚至不需要轉換爲角度,請參閱https://github.com/AzureADSamples/SinglePageApp-jQuery-DotNet。 如果你想成爲一個基於回發的應用,你可以放棄JS部分(雖然聽起來很痛苦)。

TL; DR:通過cookie保護AJAX調用不是一個乾淨的解決方案,您肯定會感到一些痛苦。您的選擇是通過專門的黑客修補問題或重構爲更加規範的方法。對不起,我有一個壞消息:(

+0

我現在唯一的選擇是使用一個隱藏的HTML IFrame來回發每20分鐘,並使用客戶端重定向到登錄頁面來處理刷新令牌錯誤 – puri

+0

我意識到這是幾個月前,但是我現在遇到了同樣的問題,你的解決方案是什麼?你如何捕捉客戶端的令牌錯誤?謝謝。 – Namrehs