2015-06-20 63 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,并看看它是如何实现的。 –