Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何抓住用户因授权cookie过期而重定向到登录页面的时刻ASP.NET MVC 3_C#_Asp.net Mvc 3_Cookies_Authorization_Action Filter - Fatal编程技术网

C# 如何抓住用户因授权cookie过期而重定向到登录页面的时刻ASP.NET MVC 3

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

现在当授权cookie过期时-用户被重定向到默认登录页面

我想抓住这样的时刻,并在登录页面上通知用户,他因为超时而被重定向

我实现了自定义属性:

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,他们将被重定向到登录,并显示他们不应该看到的消息。这并不罕见。应该是这样。若用户第一次尝试输入任何操作,他应该在逻辑上重定向到登录页面。