我已经非常努力但无法找到如何为ASP.Net Web应用程序的进程内会话设置会话超时值的解决方案.
我使用的是VSTS 2008 + .Net 3.5 + C#.以下是我自己写的将超时设置为1分钟,这是正确的吗?
我在system.web部分下写了 web.config
<sessionState timeout="1" mode="InProc" />
Run Code Online (Sandbox Code Playgroud) 我在IIS 6.0中运行ASP.NET 2.0应用程序.我希望会话超时为60分钟,而不是默认的20分钟.我做了以下事情
我仍然在20分钟时获得会话超时.还有什么我需要做的吗?
我有关于网站会话超时的代码.在web.config中,我遇到了这段代码.
<authentication mode="Forms">
<forms loginUrl="~/Auth/SignOn.aspx" timeout="40" slidingExpiration="true" />
</authentication>
<sessionState timeout="30" />
Run Code Online (Sandbox Code Playgroud)
有谁知道一个先于另一个先例,以及它们是如何不同的.谢谢.
我正在使用jquery对asp.net mvc控制器动作进行ajax调用:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult GetWeek(string startDay)
{
var daysOfWeek = CompanyUtility.GetWeek(User.Company.Id, startDay);
return Json(daysOfWeek);
}
Run Code Online (Sandbox Code Playgroud)
当会话超时时,此调用将失败,因为User对象存储在会话中.我创建了一个自定义authorize属性,以检查会话是否丢失并重定向到登录页面.这适用于页面请求,但它不适用于ajax请求,因为您无法从ajax请求重定向:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!httpContext.Request.IsAjaxRequest())
{//validate http request.
if (!httpContext.Request.IsAuthenticated
|| httpContext.Session["User"] == null)
{
FormsAuthentication.SignOut();
httpContext.Response.Redirect("~/?returnurl=" + httpContext.Request.Url.ToString());
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我在另一个线程上读到,当用户未经过身份验证并且你发出ajax请求时,你应该将状态代码设置为401(未授权),然后在js中检查它并将它们重定向到登录页面.但是,我不能让这个工作:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (Request.IsAjaxRequest() && (!Request.IsAuthenticated || User == null))
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
else
{
base.OnActionExecuting(filterContext);
} …Run Code Online (Sandbox Code Playgroud) 在我的asp.net mvc3应用程序中,我有一个自定义授权属性,如下所示.
public class CustomAuthorize : AuthorizeAttribute
{
public IAccountRepository AccountRepository { get; set; }
public CustomAuthorize()
{
this.AccountRepository = new UserModel();
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
base.AuthorizeCore(httpContext);
return AccountRepository.isEnabled(HttpContext.Current.User.Identity.Name);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我的[CustomAuthorize]控制器操作上有标记,AuthorizeCore方法工作正常 - 它执行我想要的逻辑(确保帐户实际启用),然后返回.
但是,HandleUnauthorizedRequest根据我的理解它应该允许我控制未授权请求的行为的重写方法根本不运行.我在那里放了一个断点,我把代码放在那里,我未经授权访问我的应用程序,代码永远不会运行.
我错过了什么?
编辑:我做了一些更多的研究,发现了一些其他人有这个问题,但不幸的是没有解决方案.
EDIT2:示例代码
[CustomAuthorize]
public class UserController: Controller
{
public UserController()
{
//do stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
编辑3:@Fabio
这就是我想要做的.我有一个工作正常的登录页面(表单身份验证) - 它调用我的自定义登录,然后调用我的AuthorizeCore覆盖.我的应用程序使用大量的ajax调用,我的最终目标是每当用户使用该应用程序时,管理员禁用它们,在禁用后进行ajax调用(尽管仍在登录)应该将其注销.但是,为了做到这一点,我想返回一个自定义响应,如果用户正在进行ajax调用,为此,我需要ovverride HandleUnauthorizedRequest.但是如果用户登录,我的Authorize Core(以及扩展名HandleUnauthorizedRequest)将被忽略(尽管事实上我已经在ajax正在调用的所有控制器操作上使用了标签).
简而言之:我想在每个请求上授权用户,而不仅仅是登录请求(这似乎是会员提供商现在正在做的事情)
我使用 ASP.NET Identity .. 我想将会话超时设置为无限制或最大值。我试过一些东西,但没有效果。注意:我使用共享主机。谢谢你。
//web.config
<system.web>
<customErrors mode="Off" />
<httpRuntime targetFramework="4.5" />
<authentication mode="Forms" />
<sessionState timeout="500000" />
</system.web>
//asp.identiyt config
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
ExpireTimeSpan = TimeSpan.FromDays(365),
LoginPath = new PathString("/user/login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>
(
validateInterval: TimeSpan.FromDays(365),
regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
getUserIdCallback: (id) => (Int32.Parse(id.GetUserId()))
)
}
});
}
Run Code Online (Sandbox Code Playgroud)