登录时我想生成一个新的 SessionId。我找到了一种可行的解决方案,但它需要一些相当骇人听闻的东西,并且要求应用程序具有完全信任安全策略设置。
有没有其他方法可以实现这一目标?
登录时我想生成一个新的 SessionId。我找到了一种可行的解决方案,但它需要一些相当骇人听闻的东西,并且要求应用程序具有完全信任安全策略设置。
有没有其他方法可以实现这一目标?
看起来这样有效:
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;
}
我目前正在考虑基于配置的解决方案,而不是基于代码的解决方案。我将配置 Web 服务器或负载平衡器以去除仅包含登录页面的 cookie 的请求和响应标头。删除请求标头的“cookie”标头和响应标头的“set-cookie”。
对登录页面的每个请求(GET 或 POST)都将不包含 cookie 信息,从而迫使 ASP.NET 创建一个新会话和(更重要的是)一个新会话 ID。
它比在登录时强制创建新会话效率低,但在您无法修改代码的情况下,该技术可能很有用。