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