gpt4 book ai didi

javascript - 不断丢失 session 状态 ASP.NET

转载 作者:行者123 更新时间:2023-11-29 14:41:23 25 4
gpt4 key购买 nike

我的网站不断失去其 session 状态并踢走用户,我不明白为什么。

我有一个操作过滤器,它会尝试检查 UserSession 是否仍然存在,如果不存在,它会检查用户是否已通过身份验证并尝试根据经过身份验证的用户 ID 恢复用户 session 。

如果用户未通过身份验证,我会将他们重定向到登录页面。我还有一些代码可以检查它是否是 ajax 请求并手动将状​​态代码设置为 403,以便我的 ajax 调用可以识别此状态并在 javascript 端进行重定向。

这是我的操作过滤器:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
SecuredController baseController = filterContext.Controller as SecuredController;

// Check if the session is available
if (filterContext.HttpContext.Session["UserSession"] == null)
{

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.Result = new JsonResult
{
Data = new { Error = "Unavailable", Url = "~/Account/Login" },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
return;
}
if (!string.IsNullOrEmpty(HttpContext.Current.Request.RawUrl))
{
string returnUrl = HttpUtility.UrlEncode(HttpContext.Current.Request.RawUrl);
HttpContext.Current.Response.Redirect("~/Account/Login?returnUrl=" + returnUrl);
}
else
{
HttpContext.Current.Response.Redirect("~/Account/Login");
}
}

string userId = filterContext.HttpContext.User.Identity.GetUserId();

Web.Helpers.Common common = new Helpers.Common();
UserSession userSession = common.GetUserSession(userId);

filterContext.HttpContext.Session["UserSession"] = userSession;
}

// Set the Current user to the session variable
baseController.CurrentUser = (UserSession)filterContext.HttpContext.Session["UserSession"];

// Continue executing the relevant action
base.OnActionExecuting(filterContext);
}

这是我的 Javascript 代码:

$.ajax({
type: method,
url: rootUrl + serviceUrl,
async: aSync,
data: dataParameters,
cache: false,
beforeSend: function () {
if (targetProgressContainer === undefined) {
return;
}
if ($(targetProgressContainer).length === 0) {
console.log('The Progress Container Div "' + targetProgressContainer + ' could not be found!');
return;
}

$(targetProgressContainer).html($(_progressContainer).html());
},
statusCode:{
403: function (data) {
window.top.location.href = sessionEndedUrl;
}
},
success: function (responseData, status, xhr) {
successCallback(responseData);
},
error: function (request, textStatus, errorThrown) {
errorCallback(request, textStatus, errorThrown);
}
});

这是我的 Startup.ConfigureAuth 方法:

app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},

SlidingExpiration =true,
ExpireTimeSpan = TimeSpan.FromDays(30)
});
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

// Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

我添加了一些规则来确保用户 url 是完整域

 <rules>
<rule name="Add www prefix to example.com domain" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example\.com" />
</conditions>
<action type="Redirect" url="http://www.example.com/{R:1}" />
</rule>
</rules>

有没有人有什么想法?

最佳答案

在您的一条评论中,您提到该问题是间歇性的 - 大多数时候都运行良好,但有时用户会被“踢出”?冒着问明显问题的风险 - 您是否使用“进程内” session 并在网络场上运行您的应用程序?

如果您的应用在负载均衡器后面运行并且使用“进程中” session ,就会出现您描述的症状。在这种情况下,只要负载均衡器将请求定向到同一台服务器,用户就可以了。如果稍后负载均衡器决定将其中一个请求定向到另一台服务器,则用户的 session 信息将在那里不可用,您的代码会将重定向发送到登录页面。

更新 1

我专注于 session 部分,但问题似乎出在身份验证 cookie 上。在这种情况下,使用 web.config 的 部分中指定的 key 对 cookie 进行加密/解密。如果网络场内不同服务器的这些设置不同,则在一台服务器上加密的身份验证 cookie 无法在另一台服务器上解密,从而导致用户的“IsAuthenticated”属性为假。您的 web.config 中是否有此处所述的设置:msdn.microsoft.com/en-us/library/eb0zx8fc.aspx

更新 2 - 如何将机器 key 添加到您的 web.config

下面评论中的问题是将机器 key 添加到您的应用程序的最简单方法(基于 IIS7 的示例)。

  1. 转到您的本地 IIS,选择您的站点,然后在功能 Pane 中双击“机器 key ”图标。

enter image description here

如果您的应用程序不在本地 IIS 中,您可以在“虚拟”站点上生成 key ,稍后将配置部分复制到您应用程序的 web.config 中。

  1. 点击“生成 key ”

enter image description here

  1. 检查站点的 web.config

enter image description here

  1. 您的 key 将如下例所示

enter image description here

您现在可以简单地复制 <machineKey>到您的应用程序 web.config。

关于javascript - 不断丢失 session 状态 ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37912337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com