【问题标题】:Manually associate session with current request asp.net MVC手动将会话与当前请求 asp.net MVC 关联
【发布时间】:2014-03-19 04:28:51
【问题描述】:

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

这可能吗?

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    这样的?

    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 和会话。

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

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

    • 基本身份验证。

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

    • 身份验证令牌

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

    • 使用现有协议,例如OAuth

    我建议您使用这些常见场景,以确保您不会遗漏任何东西,并让自己面临安全漏洞。

    你有什么理由不能使用这些吗?

    【讨论】:

    • 这对于过滤器来说是一个很好的开始,但是我如何告诉 asp.net 使用 X-SessionId 来查找(现有)会话并将 HttpContext.Current.User 和所有其他变量关联起来?
    • 我已经更新了我对潜在解决方案的回答,老实说你有点走投无路,可能有更好的方法,比如单点登录解决方案可能会更好?
    • 这解决了安全问题(将会话存储在数据库中)。我认为 ASP.NET 将所有会话都存储在内部数据存储中(可能只是一张地图)。是否可以引用它,以便我可以像对待普通客户一样将其他内容放入 Session 中?
    • 会话将正常工作,另见上面的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多