6

登录时我想生成一个新的 SessionId。我找到了一种可行的解决方案,但它需要一些相当骇人听闻的东西,并且要求应用程序具有完全信任安全策略设置。

有没有其他方法可以实现这一目标?

4

2 回答 2

6

看起来这样有效:

Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

通过清除该 cookie,将在服务器上创建一个具有新会话 ID 的新会话。

(参考:微软支持

编辑:这是一个使用 AJAX(使用 jQuery)在不刷新页面的情况下调用服务器代码的示例 - 它调用了两次,一次是删除第一个会话,一次是生成一个新会话。可能有更好的方法,但这确实有效。

function newSession() {
    jQuery.ajax({
        type: "POST",
        url: "WebForm1.aspx/ClearSession",
        data: "{}",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function () {
            jQuery.ajax({
                type: "POST",
                url: "WebForm1.aspx/NewSession",
                data: "{}",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function () { console.log("Success!"); },
                error: function (x, y, z) {
                    console.log("Failure!");
                }
            });
        },
        error: function (x, y, z) {
            console.log("Failure!");
        }
    });
}

在代码隐藏(对于 WebForms - 您也可以使用 MVC 控制器执行此操作):

[WebMethod]
public static void ClearSession()
{
    HttpContext.Current.Session.Abandon();
    HttpContext.Current.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
}

[WebMethod]
public static void NewSession()
{
    HttpContext.Current.Session["x"] = 123;
}
于 2012-08-27T20:11:51.747 回答
0

我目前正在考虑基于配置的解决方案,而不是基于代码的解决方案。我将配置 Web 服务器或负载平衡器以去除仅包含登录页面的 cookie 的请求和响应标头。删除请求标头的“cookie”标头和响应标头的“set-cookie”。

对登录页面的每个请求(GET 或 POST)都将不包含 cookie 信息,从而迫使 ASP.NET 创建一个新会话和(更重要的是)一个新会话 ID。

它比在登录时强制创建新会话效率低,但在您无法修改代码的情况下,该技术可能很有用。

于 2016-07-25T17:48:12.827 回答