Asp.net-Mvc
MVC .NET cookie 身份驗證系統通過令牌身份驗證訪問 Web Api
我有一個具有 Ownin cookie 身份驗證的 Mvc 5 客戶端。我還有一個受 Owin Bearer 令牌保護的 Web Api(我使用了創建令牌端點的 VS2013 Web Api 模板)
好的,現在我的 Mvc 5 客戶端需要使用我的 WebApi。我創建了一個獲取不記名令牌的方法:
internal async Task<string> GetBearerToken(string siteUrl, string Username, string Password) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(siteUrl); client.DefaultRequestHeaders.Accept.Clear(); HttpContent requestContent = new StringContent("grant_type=password&username=" + Username + "&password=" + Password, Encoding.UTF8, "application/x-www-form-urlencoded"); HttpResponseMessage responseMessage = await client.PostAsync("Token", requestContent); if (responseMessage.IsSuccessStatusCode) { TokenResponseModel response = await responseMessage.Content.ReadAsAsync<TokenResponseModel>(); return response.AccessToken; } return ""; }在我的 Mvc 動作中,我稱之為:
public async Task<ActionResult> Index() { var token = await GetBearerToken("http://localhost:6144/", "teste", "123456"); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", "Bearer "+ token); var response = await client.GetAsync("http://localhost:6144/api/values"); if (response.IsSuccessStatusCode) { var data = response.Content.ReadAsAsync<IEnumerable<string>>(); return Json(data.Result, JsonRequestBehavior.AllowGet); } } }這一切都很好……但是我需要在我的所有操作中使用Web Api……那麼我怎樣才能保留那個令牌(儘管每個請求都會獲得一個新令牌)以及如何驗證它是否過期……有可能以某種方式將其與身份驗證cookie保持在一起?處理這種情況的任何最佳做法?
謝謝
如果我做對了,您的 MVC 5 客戶端應用程序正在訪問不同應用程序的 WebAPI。MVC 5 客戶端使用 cookie 對使用者進行身份驗證。要訪問 WebAPI,您可以從 /Token 端點獲取 Bearer 令牌,並將其發送到 Authorization 標頭中。
您無需從客戶端 Javascript 程式碼呼叫 WebAPI,只需從執行在 MVC5 應用程序伺服器上的 MVC 操作中呼叫它。
在每次服務呼叫之前獲取新令牌聽起來是錯誤的。這意味著每次 2 次往返。這不可能是高性能的。
如果我沒看錯,你可以:
- 將令牌儲存在 Session 對像中。只要您的 MVC 應用程序使用者通過身份驗證並且他的會話處於活動狀態,那麼您將始終擁有相同的令牌。如果它已過期,您將從 WebAPI 獲得 401 未經授權的訪問。為了使您的 MVC 操作單元可測試,您可以將會話訪問包裝到您注入到操作中的服務中(依賴注入)。
- 您可以將令牌儲存在類似於已經存在的身份驗證 cookie 的 cookie 中。這樣你就不需要伺服器端的 Session 了。再次在這裡,我將從 Cookie 獲取令牌的訪問權限包裝在您的所有操作都使用的服務中。
我會使用會話儲存。簡單的。直線前進。但也許我錯過了什麼
希望這對您有所幫助。回饋讚賞:-)