0

我正在創建基於WebAPI的SaaS應用程序。此WebAPI可以單獨使用,無需用戶界面,需要在向WebAPI發出每個請求時發送基本身份驗證,並在調用和驗證方法時返回一些對象。從MVC WebApp消費WebAPI後端的最佳實踐

現在我面臨一個大問題:我在MVC中創建WebApp(但它可以是任何語言),我無法弄清楚如何在不需要保留用戶名和密碼的情況下調用WebAPI端點以便每次調用方法時驗證WebAPI請求。

這種特殊情況下的最佳做法是什麼? 我似乎無法找到合適的解決方案...

到目前爲止,我已經嘗試創建與HttpContext.Response.Cookies.Add方法,在那裏我存儲在cookie的userData的自定義實現的幫助的自定義Cookie的一對用戶名和密碼加密。通過這種方式,我可以調用WebAPI方法,指定每次使用正確的用戶名和密碼的BasicAuthenticationCredentials,但從長遠來看,這對我來說似乎是一種非常難以維護的方式。

我也想嘗試OAuth2的方式,但是我找不到一本關於如何實現基於SQL Server自定義用戶表的認證服務器的指南(以及Google結果列表的前五頁並沒有幫助我,他們的確讓我更加困惑於這個話題,整個OWIN和Katana的事情......)。

如果有人願意幫助我,我可以提供更多信息。

在此先感謝, 斯特凡諾。

+0

此鏈接可能會幫助您找到很好的來源:https://docs.microsoft。com/en-us/aspnet/identity/overview/getting-started/aspnet-identity-recommended-resources –

+0

感謝@RuardvanElburg,一定會檢查一下! – frikyfriky11

回答

0

下面是關於如何實現自己的OAuth2服務器一個很好的教程:

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

背後使用OAuth的主要思想是,你只需要爲你的第一個請求用戶名和密碼,並經過您將獲得一個訪問令牌,用於訪問該API。此訪問令牌將擁有一個生命週期,並且一旦過期,用戶將需要申請一個新的訪問令牌(通過再次發送用戶憑據或使用將用作憑據替代的刷新令牌)。

這種方法背後的好處在於,由於存取令牌有一生的存在,即使其中一個令牌受到損害,您也可以撤銷它(或等到它過期,例如,您可以創建令牌每5分鐘更新一次,或者更少),客戶將自動要求一個新的,這將是故事的結束。另一方面,如果您總是收到用戶憑證並且這些憑證已被泄露,則用戶需要更改它們,風險將一直存在,直到用戶最終更改其憑據(並且這是手動過程,用戶需要請注意這個問題,而OAuth方法只是一直刷新這些令牌)。

此外,請記住保留所有通過HTTPS的通信,因爲令牌是敏感信息,並且您不希望竊聽者通過截取通信獲取訪問令牌,甚至不希望更新令牌。如果他能夠做到這樣的事情,那麼即使每分鐘刷新一次令牌也是一種無用的方法,可以阻止某人獲取您發送的每個令牌。

+0

感謝您的回覆。我實際上試圖儘可能地從你提供的鏈接中學習。還有一個問題:將從服務器接收到的令牌存儲在cookie的'userData'中是否是一種好習慣?在我通過WebAPI的OAuth服務器進行身份驗證之後,來自MVC前端的調用會是什麼樣的?我應該每次在請求中傳遞令牌嗎?再次感謝。 – frikyfriky11

+0

嗯,這取決於。看起來您正在計劃創建一個Web應用程序,您將成爲唯一一個使用API​​的Web應用程序,並且它不會成爲任何想要使用它的人可用的API(即Ebay的API)。如果是這種情況,那麼我認爲將該令牌作爲加密值存儲在數據庫中會更好。畢竟,請記住,令牌現在與時間用戶名和密碼相同,因此需要將其作爲敏感信息進行威脅。關於請求,是的,您需要在每個請求上發送訪問令牌,以便服務器能夠識別您。 –

+0

嗯,也許我以一種不好的方式解釋了自己......我的意思是詢問將接收到的令牌存儲在前端是否是一種好的做法......想象一下這種情況:您的前端應用程序要求WebAPI一個令牌,WebAPI發送一個令牌給你在接下來的請求中進行認證。當你想從你的前端發出一個請求時,你必須在請求頭添加先前發給你的令牌。這個令牌可以保存在客戶端的設備上,以便進一步驗證,直到它到期爲止......但是這樣做的最佳做法是什麼?對不起,對文本牆:D – frikyfriky11