手动将会话与当前请求asp.net MVC关联

时间:2014-02-19 03:23:47

标签: asp.net asp.net-mvc

我有一个MVC 5 asp.net网站,我需要向独立的移动客户端公开一些REST API。该网站的其余部分使用基于表单的安全性,它将ASP.NET_SessionId设置为cookie,并用于在用户登录后通过请求对用户进行身份验证。使用我的移动应用程序,我无法使用cookie方法因为跨多曼问题。我想要做的是添加标题“X-SessionId”与ASP.NET_SessionId的值,然后在服务器端,有一个查找该字段的过滤器,如果它存在,将请求与给定的会话。 (客户端将使用AJAX POST调用登录,该调用将在成功登录后返回ASP.NET_SessionId。)

这可能吗?

1 个答案:

答案 0 :(得分:0)

这样的东西?

public sealed class CustomSecurityAttribute : ActionFilterAttribute
{ 

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (filterContext == null)
        throw new ArgumentNullException("filterContext");
    if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["X-SessionId"]) &&      IsAuthenticated(ilterContext.HttpContext.Request.Headers["X-SessionId"]))
        filterContext.Result = new HttpNotFoundResult();
}

private bool IsAuthenticated(string sessionId)
{
    // get your user details from your database (or whatever)
    var user = new UserRepository().Get(sessionId);

    if (user == null)
        return false;

   // build up an identity, use your own or out of the box.
    FormsIdentity itentity = new MyIdentity(user);

   // Set the user
   filterContext.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(itentity , user.Roles);

    return true;
}

}

您将不得不在数据库中存储当前会话,例如,当用户登录时抓取sessionid并将其粘贴到数据库中,因此您知道他们有1..n个当前会话。

然后您可以将其作为身份验证的一部分进行查找。

修改

让我们退后一步,暂时不要介意cookie和会话。

你有一个网站和一个安静的api,他们都服务于不同的目的和客户,并有不同的安全要求。

那么保护Api最常见的选择是什么?

  • 基本身份验证。

    大多数restful API都需要在每个请求中发送用户名/密码,作为标题的一部分或在请求本身中发送。

  • 身份验证令牌

    当您检查令牌时,您可以提供与用户帐户关联的令牌(guid就足够了)。

  • 使用OAuth

  • 等现有协议

我建议您使用这些常见方案,以确保您不会遗漏任何内容,并打开自己的安全漏洞。

是否有理由不能使用其中任何一种?