Asp.net mvc ASP.NET MVC 3确定会话状态(新建或超时)

Asp.net mvc ASP.NET MVC 3确定会话状态(新建或超时),asp.net-mvc,asp.net-mvc-3,session,forms-authentication,Asp.net Mvc,Asp.net Mvc 3,Session,Forms Authentication,我目前使用ASP.NET MVC应用程序的默认表单身份验证方法 首先,我的所有需要身份验证的actionmethods都有这个属性 [Authorize()] 当有人试图调用该操作方法“服务”的页面,但他们还没有登录时,它会将他们发送到登录页面…完美!然而,如果他们的会话超时并试图点击该页面,他们也会被重定向到登录页面,但没有说明原因。我希望能够确定这是新的访问,还是超时,并相应地在登录屏幕上显示不同的消息 这可能吗?在登录时,您可以设置绑定到浏览器会话的cookie。如果该cookie存在,

我目前使用ASP.NET MVC应用程序的默认表单身份验证方法

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

[Authorize()]
当有人试图调用该操作方法“服务”的页面,但他们还没有登录时,它会将他们发送到登录页面…完美!然而,如果他们的会话超时并试图点击该页面,他们也会被重定向到登录页面,但没有说明原因。我希望能够确定这是新的访问,还是超时,并相应地在登录屏幕上显示不同的消息


这可能吗?

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

请查看我创建的此自定义授权属性。它是为了实现一些自定义的基于角色的授权,但是您也可以让它为您工作。有一个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);
            }
        }
    }