我一直在研究ASP .Net MVC应用程序,该应用程序将从具有不同配置的不同站点登录请求(因此我无法使用FormsAuthentication SSO方式)。我决定解决这个问题的方法是创建临时登录请求令牌,因此每个令牌只能使用一次,并且使用这些令牌,应用程序将进行用户会话。
为了避免不必要地生成令牌,我想先询问服务器用户是否已经登录。我决定通过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 :(得分:0)
MVC行动不应该返回布尔值。这并不一定意味着你需要返回一个完整的视图对象,因此查询动作将导致一个完整的html,这很难解析。
您可以强制您的操作方法返回JSON或纯文本。操作的类型仍为ActionResult
(可选择JsonResult
),但您可以返回Json()
或Content()
。
例如:
public ActionResult UserIsLogged(int userId)
{
if (....)
{
return Json(true);
}
return Json(false);
}
我还建议你的Web API动作返回json,而不是原语。任何客户都可以更轻松地解析响应。