2015-06-20 41 views
0

我一直在圍繞一個ASP .Net MVC應用程序,它將從不同站點以不同配置(因此我無法使用FormsAuthentication SSO方式)登錄請求。我決定解決這個問題的方式是創建臨時登錄請求令牌,因此每個令牌只能使用一次,並且使用這些令牌,應用程序將進行用戶會話。與會話狀態相同的項目中的Web API和MVC

爲了避免不必要地生成令牌,我想先詢問服務器是否用戶尚未登錄。我決定嘗試通過HttpClient。代碼的寫法如下。

  var client = new HttpClient { BaseAddress = new Uri("http://mywidget.com") }; 
      client.Timeout = TimeSpan.FromMilliseconds(18000); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

      var response = client.GetAsync(String.Format("/userIsLogged/{0}", userId)).Result; 
      response.EnsureSuccessStatusCode(); 
      bool isLogged = response.Content.ReadAsAsync<bool>().Result; 
      return isLogged; 

我想出了兩種可能的方式做出驗證。我按如下方式在Web API和MVC中編寫了相同的操作。

[HttpGet] 
    public bool UserIsLogged(int userId) 
    { 
     return (HttpContext.Current.Session != null && ((int)HttpContext.Current.Session["userId"]) == userId); 
    } 

有了這兩個我發現問題,我不知道哪個服務器會更好爲我的目的。

MVC操作將答案作爲HTML返回,客戶端顯然無法處理答案,而且我還沒有找到正確處理它的方法。

API操作可以處理答案,但Web API默認情況下不處理會話狀態;你必須調整它,所以它可以,而且我不知道這兩個會話是否會相同。

我不確定哪一個是正確的路要走,或者如果我應該嘗試另一種解決方案來解決這個問題。

謝謝。

回答

0

MVC操作不應該返回布爾值。這並不一定意味着您需要返回一個完整的視圖對象,因此查詢該操作將導致完整的html,這很難解析。

您可以強制您的操作方法返回JSON或純文本。行動的類型仍然是ActionResult(它可能是JsonResult),但您可以返回Json()Content()

例如:

public ActionResult UserIsLogged(int userId) 
{ 
    if (....) 
    { 
     return Json(true); 
    } 
    return Json(false); 
} 

我也建議你的Web API行動來回報,而不是原語JSON藏漢。任何客戶端都可以更輕鬆地解析響應。

+0

謝謝。有效! 你說得對。通過將響應作爲Json發送,即使它是一個Action Result,客戶也可以讀取答案。 你對另一個也是對的。我將開始將所有內容都發送給Json,並看看它是如何實現的。 –