如何在页面上执行任何活动之前检查MVC中的会话变量是否存在?

时间:2013-12-26 16:18:02

标签: c# asp.net-mvc session

我有一个场景:

搜索控件我们的数据输入人员输入用户ID并搜索他们的详细信息并浏览与该用户相关的不同页面。

所以在我的MVC应用程序中,我正在设置一个会话来维护会话变量中的用户ID。在页面上的每个方法(如编辑,更新..etc)我正在检查用户会话是否存在。我可以在全球范围内进行,所以我不需要每次检查吗?就像在global.asax中一样

protected void Application_Start()
{
}

或编写自定义方法来检查会话。

请有人帮助我做到这一点。

由于

2 个答案:

答案 0 :(得分:12)

在MVC应用程序中,您可以创建继承自AuthorizeAttribute的属性, 然后在该属性中,您可以检查您的会话。您可以将它放在需要的控制器或GlobalFilters集合上。

<强> UPDATE1

以下是此类逻辑的示例

public class SessionAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Session["InsuredKey"] != null;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("/some/error");
    }
}

然后你可以将它放在需要的控制器下,如

[SessionAuthorize]
public class SomeController
{
}

答案 1 :(得分:9)

接受的答案实际上并未重定向到HandleUnauthorizedRequest时间指定的页面。

我必须修改一些东西才能使其正常工作

public class SessionAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Session["InsuredKey"] != null;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
                              new RouteValueDictionary
                              {
                                   { "action", "YourAction" },
                                   { "controller", "YourController" }
                              });
    }
}

对未来的用户可能会有所帮助。