【问题标题】:how to check session variable existence in MVC before we do any activity on page?在我们在页面上进行任何活动之前,如何检查 MVC 中的会话变量是否存在?
【发布时间】:2014-01-14 06:49:33
【问题描述】:

我有这样的场景:

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

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

protected void Application_Start()
{
}

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

请有人帮我解决这个问题。

谢谢

【问题讨论】:

    标签: c# asp.net-mvc session


    【解决方案1】:

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

    更新1

    这是一个这样的逻辑示例

    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
    {
    }
    

    【讨论】:

    • 你认为 [Authorize(Session["InsuredKey"] != null)] 会在控制器类上工作吗?
    • 不,不会。您需要编写自定义实现。
    • 我认为这在我的场景中非常有效。不过,我有一个愚蠢的问题。你认为我可以将这个 SessionAuthorizeAttribute 类放在我的类库项目中,这是解决方案的一部分吗?
    • 当然可以放在任何地方,但是这个库应该在MVC应用中引用。
    • 最后一个问题...如果 sessionauthorize 类返回 false,它会将页面重定向到哪里?
    【解决方案2】:

    接受的答案实际上并没有重定向到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" }
                                  });
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多