C# 如何抓住用户因授权cookie过期而重定向到登录页面的时刻ASP.NET MVC 3
现在当授权cookie过期时-用户被重定向到默认登录页面 我想抓住这样的时刻,并在登录页面上通知用户,他因为超时而被重定向 我实现了自定义属性:C# 如何抓住用户因授权cookie过期而重定向到登录页面的时刻ASP.NET MVC 3,c#,asp.net-mvc-3,cookies,authorization,action-filter,C#,Asp.net Mvc 3,Cookies,Authorization,Action Filter,现在当授权cookie过期时-用户被重定向到默认登录页面 我想抓住这样的时刻,并在登录页面上通知用户,他因为超时而被重定向 我实现了自定义属性: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization( AuthorizationContext filterContext ) { var cookie = filterCont
public class CustomAuthorizeAttribute : AuthorizeAttribute {
public override void OnAuthorization( AuthorizationContext filterContext ) {
var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
var ticket = FormsAuthentication.Decrypt(cookie.Value);
if (ticket.Expired) {
//TODO redirect to Account/LogOn with some flag
但是,不管cookie是如何设置的(持久性或非持久性),如果已过期,它将为null,如果未过期,它将不为null。所以我无法到达(ticket.Expired)的时刻,因为在那个时刻它是空的
if(filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName] == null)
{
Response.Redirect("login.aspx?expired=true");
}
在login.aspx
-页面上:
在页面中加载:
string expired = Request.QueryString["expired"].ToString();
if(expired == "true")
{
//Show Message
}
使用过滤器上下文
:
var cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
//not logged.
if (cookie == null)
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "area", "" }, { "controller", "Account" }, { "action", "LogOn" }, { "returnUri", filterContext.HttpContext.Request.RawUrl }});
FormsAuthenticationTicket ticket = null;
ticket = FormsAuthentication.Decrypt(cookie.Value);
//not logged.
if (ticket == null)
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "area", "" }, { "controller", "Account" }, { "action", "LogOn" }, { "returnUri", filterContext.HttpContext.Request.RawUrl }});
//logged, but expired.
if (ticket.Expiration > DateTime.Now) {
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "area", "" }, { "controller", "Account" }, { "action", "LogOn" }, { "returnUri", filterContext.HttpContext.Request.RawUrl }, { "alert", "Session expired"} });
}
看起来我发现了问题所在,cookie在应用程序\u BeginRequest中过期时仍然可用,但在应用程序\u AuthenticateRequest中它已经为空(有东西正在擦除它),所以我将把重定向逻辑放入应用程序\u BeginRequest中如果用户首先访问站点,cookie未设置,结果他将看到消息-“由于超时,您已被重定向到登录页面“。所以,检查cookie是否为null,重定向,否则不为空。阅读我的注释,以获得第一个答案,我解释了为什么它不起作用。我的问题是,当cookie过期时,它是空的,但它也可以是空的,因为用户还没有被授权,并且会收到相同的错误消息。您不想让用户在首次进入站点时看到该消息吗?如果不想-在你的家庭行动中,不要使用CustomAuthorization属性。如果需要-使用CustomAuthorizeAttribute。我是否理解你的意思?好主意,但大多数时候用户启动应用程序不是从主页,而是重定向到登录,然后从主页重定向回来。这意味着,如果用户首先来到标有CustomAuthorizeAttribute的CasesController,他们将被重定向到登录,并显示他们不应该看到的消息。这并不罕见。应该是这样。若用户第一次尝试输入任何操作,他应该在逻辑上重定向到登录页面。