- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的网站不断失去其 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 的
更新 2 - 如何将机器 key 添加到您的 web.config
下面评论中的问题是将机器 key 添加到您的应用程序的最简单方法(基于 IIS7 的示例)。
如果您的应用程序不在本地 IIS 中,您可以在“虚拟”站点上生成 key ,稍后将配置部分复制到您应用程序的 web.config 中。
您现在可以简单地复制 <machineKey>
到您的应用程序 web.config。
关于javascript - 不断丢失 session 状态 ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37912337/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!