Asp.net-Mvc

MVC .NET cookie 身份驗證系統通過令牌身份驗證訪問 Web Api

  • April 1, 2014

我有一個具有 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 次往返。這不可能是高性能的。

如果我沒看錯,你可以:

  1. 將令牌儲存在 Session 對像中。只要您的 MVC 應用程序使用者通過身份驗證並且他的會話處於活動狀態,那麼您將始終擁有相同的令牌。如果它已過期,您將從 WebAPI 獲得 401 未經授權的訪問。為了使您的 MVC 操作單元可測試,您可以將會話訪問包裝到您注入到操作中的服務中(依賴注入)。
  2. 您可以將令牌儲存在類似於已經存在的身份驗證 cookie 的 cookie 中。這樣你就不需要伺服器端的 Session 了。再次在這裡,我將從 Cookie 獲取令牌的訪問權限包裝在您的所有操作都使用的服務中。

我會使用會話儲存。簡單的。直線前進。但也許我錯過了什麼

希望這對您有所幫助。回饋讚賞:-)

引用自:https://stackoverflow.com/questions/22568409