2011-11-21 105 views
4

我目前对我的ASP.NET MVC应用程序使用默认窗体身份验证方法。ASP.NET MVC 3确定会话状态(新建或超时)

首先我actionmethods的需要身份验证我有这个属性

[Authorize()] 

当有人试图调用页面这一行动方法“服务”而他们还没有登录,这将它们发送到登录页面...完美!但是,如果他们的会话超时并尝试打开该页面,则他们也会被重定向到登录页面,而不会显示原因。我希望能够确定它是否是新的访问,或者是否是超时,并相应地在登录屏幕上显示不同的消息。

这可能吗?

回答

0

在登录时,您可以设置一个与浏览器会话绑定的cookie。如果该cookie存在,则知道会话超时。如果不是,你知道这是一次新的访问。

2

看看我所做的这个自定义授权属性。这是为了实施一些基于自定义角色的授权,但你也可以让它为你工作。有一个Session.IsNewSession属性可以检查这个请求是否发生在一个新的会话上。

public class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 
     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      if (httpContext.User.Identity.IsAuthenticated) 
      { 
       httpContext.User = new GenericPrincipal(httpContext.User.Identity, AdminUserViewModel.Current.SecurityGroups.Select(x => x.Name).ToArray()); 
      } 
      return base.AuthorizeCore(httpContext); 
     } 

     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       filterContext.Result = new RedirectResult("/Authentication/NotAuthorized", false); 
      } 
      else 
      { 
       if (filterContext.HttpContext.Session.IsNewSession) 
       { 
        // Do Something For A New Session 
       } 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 
    }