Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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# MVC3中未授权时仍在执行的操作_C#_Asp.net Mvc 3 - Fatal编程技术网

C# MVC3中未授权时仍在执行的操作

C# MVC3中未授权时仍在执行的操作,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我有一个MVC3应用程序,用户需要经过身份验证才能访问该网站。我已登录,屏幕上显示数据,然后我离开了。一小时后我回来了,现在用户已经自动注销了。但是当我点击按钮获取数据时,没有重新登录,我得到了死亡原因的黄色屏幕,我的对象为空。这是我的行动: [Authorize] public ActionResult Index(string id) 我认为[Authorize]属性确保在未经身份验证的情况下不会执行此操作,但显然它没有或我没有正确使用它。那么,如何使用[Authorize]或

我有一个MVC3应用程序,用户需要经过身份验证才能访问该网站。我已登录,屏幕上显示数据,然后我离开了。一小时后我回来了,现在用户已经自动注销了。但是当我点击按钮获取数据时,没有重新登录,我得到了死亡原因的黄色屏幕,我的对象为空。这是我的行动:

  [Authorize]
    public ActionResult Index(string id)
我认为[Authorize]属性确保在未经身份验证的情况下不会执行此操作,但显然它没有或我没有正确使用它。那么,如何使用[Authorize]或任何其他属性来确保用户始终经过身份验证,如果没有,则将其带到登录屏幕?谢谢

另外,只有在发生超时时才会发生这种情况。如果我只是试图通过键入URL而不是登录来访问一个视图,我会得到预期的登录屏幕

一小时后我回来了,现在用户已经自动注销了

如果执行该操作,则表示用户未注销。
[Authorize]
属性按预期工作

我怀疑你的问题与身份验证无关。它与您正在使用的ASP.NET会话有关。请记住,表单验证cookie和ASP.NET会话是两个完全不同的概念。因此,我猜当用户登录时,您已经在ASP.NET会话中存储了一些内容。除了ASP.NET会话在默认情况下在20分钟后过期,并且独立于窗体身份验证cookie超时进行配置之外。因此,虽然用户身份验证cookie仍然有效,并且用户已通过身份验证,但它已丢失其会话,因为会话已过期,或者web服务器只是简单地回收了您的应用程序,而您存储到会话中的所有内容当然都丢失了

话虽如此,让我们看看解决这个问题的不同可能性:

  • 我建议的方法是摆脱会话。只需将
    放在web.config中,忘记ASP.NET会话在无状态应用程序中引入的状态
  • 编写自定义授权属性,该属性除了检查身份验证cookie是否有效外,还将检查会话是否仍然包含值:

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var authorized = base.AuthorizeCore(httpContext);
            if (!authorized)
            {
                return false;
            }
    
            return httpContext.Session["someKeyThatYouHaveStored"] != null;
        }
    }
    
  • 然后使用此自定义属性:

    [MyAuthorize]
    public ActionResult Index(string id)
    
    一小时后我回来了,现在用户已经自动注销了

    如果执行该操作,则表示用户未注销。
    [Authorize]
    属性按预期工作

    我怀疑你的问题与身份验证无关。它与您正在使用的ASP.NET会话有关。请记住,表单验证cookie和ASP.NET会话是两个完全不同的概念。因此,我猜当用户登录时,您已经在ASP.NET会话中存储了一些内容。除了ASP.NET会话在默认情况下在20分钟后过期,并且独立于窗体身份验证cookie超时进行配置之外。因此,虽然用户身份验证cookie仍然有效,并且用户已通过身份验证,但它已丢失其会话,因为会话已过期,或者web服务器只是简单地回收了您的应用程序,而您存储到会话中的所有内容当然都丢失了

    话虽如此,让我们看看解决这个问题的不同可能性:

  • 我建议的方法是摆脱会话。只需将
    放在web.config中,忘记ASP.NET会话在无状态应用程序中引入的状态
  • 编写自定义授权属性,该属性除了检查身份验证cookie是否有效外,还将检查会话是否仍然包含值:

    public class MyAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var authorized = base.AuthorizeCore(httpContext);
            if (!authorized)
            {
                return false;
            }
    
            return httpContext.Session["someKeyThatYouHaveStored"] != null;
        }
    }
    
  • 然后使用此自定义属性:

    [MyAuthorize]
    public ActionResult Index(string id)
    

    与按下按钮对应的POST操作是否也标记有[Authorize]-属性?如果没有,回发可能会通过,并且您最终会执行一个操作,而没有进行身份验证。与按下的按钮对应的回发操作是否也标记有[Authorize]-属性?如果没有,回发可能会通过,并且您最终会执行一个操作,而没有进行身份验证。您所说的完全有道理。我如何通过代码检查它?Ctrl+F并在解决方案中搜索
    Session
    。或者只需在web.config:
    中禁用会话。这是我经常做的一件事,以确保会话不被使用。不。我的意思是没有类似于session.discard或类似的东西我可以标记为?您可以在Global.asax中订阅session\u End事件,但请记住,只有在使用InProc会话模式时才会触发此事件。如果您使用OutOfProc,它将永远不会触发。因此,在会话结束时,如果会话已过期,我可以让应用程序转到登录页面?您所说的完全有道理。我如何通过代码检查它?Ctrl+F并在解决方案中搜索
    Session
    。或者只需在web.config:
    中禁用会话。这是我经常做的一件事,以确保会话不被使用。不。我的意思是没有类似于session.discard或类似的东西我可以标记为?您可以在Global.asax中订阅session\u End事件,但请记住,只有在使用InProc会话模式时才会触发此事件。如果您使用OutOfProc,它将永远不会触发。因此,在会话结束时,如果会话已过期,我可以让应用程序转到登录页面?