2013-11-26 55 views
5

在Stackflow中有一些類似的話題,但我發現他們都沒有回答我的問題。應該如何存儲Web API訪問令牌?

ASP.NET Web API 2是我們現在使用的。我現在可以接受來自我的WebAPI的身份驗證請求CORS。通過在Authorization標頭(承載xxx)中發送訪問令牌,我可以訪問由[Authorize]標記保護的資源。

問題是,我如何實現類似於常規登錄表單中的「記住我」複選框的功能?我們只需要下一次訪問我們的網頁時用戶不需要再次登錄。訪問令牌僅用於一個會話嗎? WebAPI2如何設置令牌的到期日期?我們如何在會話中保存一些信息或使用本地存儲來存儲這些認證信息?當我們將這個令牌存儲在客戶端時,我們是否需要某種加密來保護它?

您在實施「記住我」功能時有何建議?

+0

感謝您的編輯,b__。 – Blaise

回答

4

您的身份驗證提供程序應該爲您提供執行此操作的功能。如果您使用ASP.Net會員供應商,這很簡單:

FormsAuthentication.RedirectFromLoginPage(strUserName, true); 

上面的「true」設置了一個持久cookie。

當您使用CORS並將身份驗證cookie發送到您的WebApi時,WebApi並不關心身份驗證是來自舊的「記住我」cookie還是來自新登錄。所有關心的是在授權標頭中傳遞的cookie值是有效的。

至於cookie的加密,這也是您的身份驗證提供商應該爲您提供的開箱即用功能。

+0

感謝您的回答。我們使用的是CORS,訪問令牌應該存儲在客戶端,它只有HTML和JavaScript。看起來你建議將標記存儲在cookie中,不是嗎? – Blaise

+0

是的,這就是我正在做的。我現在需要添加我們正在使用集中的STS,它使用證書來加密身份驗證令牌。沒有客戶端上的解密證書是沒有用的。所以這就是爲什麼我使用cookie來解決這個問題的原因,它允許我爲此使用開箱即用的解決方案。如果你不想要這個,你可以看看ThinkTecture.com。這些人有一個解決方案,它可以讓你發送一個Json令牌來進行Cors認證。 – Morten

+0

謝謝。我可否知道你使用的是什麼「集中式STS」? – Blaise

6

「問題是,我怎麼能實現類似的功能‘記住我’在常規的登錄表單複選框?」

保存在客戶方的localStorage令牌時,「記住我」被選中=>當標籤頁/瀏覽器關閉時,令牌仍然有效,並且下次您自動登錄時

當「記住我」未檢查時,將令牌保存在客戶端會話存儲中=> 每次關閉標籤/瀏覽器會話存儲被清除。下一次你檢查它不存在的令牌。因此喲必須再次登錄...

「我們希望的是用戶下次訪問我們的網頁時不需要再次登錄。」

查看上面的答案!

是僅一個會話的訪問令牌嗎?

是瀏覽器中的一個選項卡是一個會話。

WebAPI2如何設置令牌到期?

您設置令牌到期的時間!

如何在會話中保存一些信息或使用本地存儲來存儲此類驗證信息?

只有加密令牌存儲在客戶端從來用戶名/密碼

當我們存儲此令牌,在客戶端,我們需要某種形式的加密來保護呢?

令牌在服務器端被加密,然後被髮送到客戶端用於每個請求。客戶端不需要能夠讀取令牌。客戶必須發送它與永遠的請求這就是它。

+2

我知道這個問題,答案是舊的,但仍然存在:sessionStorage的問題在於它不是在同一瀏覽器的標籤之間持續存在。如果用戶試圖從鏈接中打開一個新的標籤/窗口而不會丟失他在當前標籤頁/窗口上所做的工作,應用程序將要求再次登錄,因爲對於該新的標籤頁/窗口,將不會有對象sessionStorage了... – CesarD