Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 会话固定-更改asp.net core 2上的会话ID_Session_Asp.net Core - Fatal编程技术网

Session 会话固定-更改asp.net core 2上的会话ID

Session 会话固定-更改asp.net core 2上的会话ID,session,asp.net-core,Session,Asp.net Core,根据我所了解的情况,我们 sessionId存储在cookie.AspNetCore.Session 删除Cookie并清除会话不会产生任何效果 context.HttpContext.Session.Clear(); foreach (var cookie in context.HttpContext.Request.Cookies.Keys) { context.HttpContext.Response.Cookies.Delete(cookie); } 因此,问题是我们能否以

根据我所了解的情况,我们

  • sessionId
    存储在cookie
    .AspNetCore.Session
  • 删除Cookie并清除会话不会产生任何效果

    context.HttpContext.Session.Clear();
    foreach (var cookie in context.HttpContext.Request.Cookies.Keys)
    {
         context.HttpContext.Response.Cookies.Delete(cookie);
    }
    

  • 因此,问题是我们能否以某种方式更改
    会话ID
    ,或者是否有办法保护我们不受会话修复的影响?

    会话。清除
    只会删除会话中的所有数据,实际上不会删除会话本身。这将在达到超时时发生。在我看来,ASP.NET核心团队没有实现以前存在的
    会话。放弃
    ,这是一个奇怪的选择,因为这实际上会删除实际会话本身

    只要实际会话仍然存在,即使它的数据不再存在,它仍然可以由该会话id检索,因此,问题转移到客户端

    重要的是,服务器实际上不能让客户机做任何事情。调用
    Cookies.Delete
    实际上只为过期日期在过去的同一个Cookie发送一个新的
    Set Cookie
    响应头。这将提示客户端(最有可能是浏览器)删除该cookie,因为它现在已过期。但是,这完全是客户端的100%,因此,如果出现错误,或者客户端没有接受更改,或者客户端出于任何原因拒绝遵守,cookie将保留。然后,如果cookie仍然存在,并且由其包含的会话id标识的会话仍然存在,则可以恢复该会话

    长话短说,你所拥有的代码应该是有效的,除了你已经在做的事情之外,你真的没有别的事情可以做。如果会话没有被放弃,那么在某个地方还存在一些其他问题(很可能是客户端的问题)

    …或者有没有办法保护我们不受会话修复的影响

    是的,有!国家:

    不幸的是,某些平台,尤其是Microsoft ASP,不会为sessionid Cookie生成新值,而只是将现有值与新会话关联。这保证了几乎所有的ASP应用程序都容易受到会话固定的攻击,除非它们已经采取了特定的措施来防止会话固定

    同一页推荐了一种ASP.Net方法,我们在所有ASP.Net应用程序中都使用了这种方法,并且通过了pen测试。我认为它对ASP.Net Core仍然有效:

    我们的想法是,由于ASP禁止对AspSessionIdxxxx cookie的写入访问,并且不允许我们以任何方式更改它,因此我们必须使用我们可以控制的其他cookie来检测任何篡改。因此,我们将用户浏览器中的cookie设置为随机值,并将会话变量设置为相同的值。如果会话变量和cookie值不匹配,那么我们就有潜在的固定攻击,应该使会话无效,并强制用户再次登录

    这是我们在.Net Core Razor页面中如何实现这一点的一个简化示例,应该让您了解如何自己实现它:

    public IActionResult OnPost()
    {
    登录();
    返回重定向(“~/Login”);
    }
    私有void登录()
    {
    //检查用户的凭据并执行所有其他必要的操作。
    // ... 
    //创建用于保护会话的随机值。
    字符串authId=GenerateAuthId();
    //将值存储在会话和Cookie中。
    HttpContext.Session.SetString(“AuthId”,AuthId);
    CookieOptions=新建CookieOptions()
    {
    Path=“/”,
    HttpOnly=true,
    安全=正确,
    SameSite=严格
    };
    Append(“AuthCookie”,authId,options);
    }
    私有字符串GenerateAuthId()
    {
    使用(RandomNumberGenerator rng=new RNGCryptoServiceProvider())
    {
    字节[]令牌数据=新字节[32];
    rng.GetBytes(令牌数据);
    返回Convert.ToBase64String(tokenData);
    }
    }
    
    检查会话和Cookie的内容,无论您需要它在哪里。如果它们不匹配,您应该
    清除
    会话(我认为,
    会话.放弃
    在.Net Core中仍然可用)并注销用户

    public void OnGet()
    {
    字符串cookieValue=Request.Cookies[“AuthCookie”];
    string sessionValue=HttpContext.Session.GetString(“AuthId”);
    如果(cookieValue==null | | sessionValue==null | | cookieValue!=sessionValue)
    {
    //使会话无效并注销当前用户。
    }
    }