[英]ASP.NET MVC & Angular: Custom Attribute / ActionFilter when Session Cookies expire, want it to redirect to Login page but it doesn't always work
细节
我在Angular中使用ASP.NET MVC。 如果我进行硬刷新(F5),它将达到我创建的属性就可以了。当会话cookie存在时,也可以对其进行访问。 但是说用户在某个页面上,并且会话cookie在他在页面上时就过期了。代码仍然可以访问我的Angular代码,但是一旦它应该首先命中我的Controller或我的Attribute,它就不会访问。 因此,此时网页上没有任何内容,也不会重定向到“登录”屏幕。
我也在附近搜索并搜索了该网站,但没有找到任何有效的方法。
我的密码
AccountController以外的我所有控制器的属性(由于某种原因,它会导致重定向循环?)。 我将此放在所有控制器的顶部。
[CustomFilters.VerifySession]
我的自定义属性
public class CustomFilters
{
public class VerifySessionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var userId = filterContext.HttpContext.Session["UserId"];
var userName = filterContext.HttpContext.Session["UserName"];
if (userId == null || userName == null)
filterContext.Result = new RedirectResult(string.Format("/Account/Login"));
}
}
}
我的登录功能
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
...
Session["UserId"] = UserId;
Session["UserName"] = sql.UserProfiles.Where(c => c.UserId == UserId).Select(x => x.UserName).FirstOrDefault();
...
}
Web.config
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="1" /> //set to 1 just for testing purposes
</authentication>
<sessionState timeout="1" /> //set to 1 just for testing purposes
</system.web>
没有足够的细节来了解正在发生的事情,因此有一些想法:
首先,表单身份验证模块将在未经身份验证的请求到达您的过滤器或控制器之前重定向。 它的工作方式是表单模块将拦截应用程序中任何位置生成的任何401未经身份验证的响应,并将其替换为302重定向到登录页面的内容。
其次,这些重定向不适用于ajax请求。 您没有提到是否在浏览器的开发工具中检查了响应,但是如果您发送带有过期cookie的ajax请求,浏览器将自动遵循由forms模块发出的重定向,但实际上不会将用户重定向到登录页面-相反,您只需在ajax请求中获取登录页面的HTML作为响应数据即可。
因此,在我看来,您遇到的问题是,表单模块正在将未经身份验证的请求重定向到登录页面,但这仅对角度框架发出的Ajax请求无效。
基本上,您需要一些javascript代码来识别何时收到未经身份验证的响应,并实际上将页面重定向到登录页面,而不是解析响应。 我自己的解决方案(不使用angular的)是简单地对未经身份验证的请求禁用302重定向,然后使用javascript处理401响应: 处理asp.net Web Api中未经身份验证的请求的最佳方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.