Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
使用浏览器';s SignOut()后的后退按钮允许访问安全页面(ASP.NET MVC)_Asp.net_Asp.net Mvc_Authentication - Fatal编程技术网

使用浏览器';s SignOut()后的后退按钮允许访问安全页面(ASP.NET MVC)

使用浏览器';s SignOut()后的后退按钮允许访问安全页面(ASP.NET MVC),asp.net,asp.net-mvc,authentication,Asp.net,Asp.net Mvc,Authentication,我有一个MVC应用程序,它使用[授权]来保护私有位。当我选择SignOut()URL时,它会将我注销,但如果我点击浏览器上的“后退”按钮,它会转到安全页面,甚至允许我使用表单。动作发生,然后显示我已注销。问题是它执行安全操作(在数据库中插入一行)。然后,我可以再次使用“后退”按钮,重新开始。如果我在注销后使用“后退”按钮并点击“浏览器刷新”,则表明我已注销并拒绝访问安全页面 我错过了什么重要的事情吗?看起来这可能是一个非常大的安全问题 public ActionResult LogOff(str

我有一个MVC应用程序,它使用[授权]来保护私有位。当我选择SignOut()URL时,它会将我注销,但如果我点击浏览器上的“后退”按钮,它会转到安全页面,甚至允许我使用表单。动作发生,然后显示我已注销。问题是它执行安全操作(在数据库中插入一行)。然后,我可以再次使用“后退”按钮,重新开始。如果我在注销后使用“后退”按钮并点击“浏览器刷新”,则表明我已注销并拒绝访问安全页面

我错过了什么重要的事情吗?看起来这可能是一个非常大的安全问题

public ActionResult LogOff(string ReturnUrl)
{

    FormsAuth.SignOut();

    if (!String.IsNullOrEmpty(ReturnUrl))
    {
        return Redirect(ReturnUrl);
    }
    else
    {

    return RedirectToAction("Index", "Page");
    }
}

您是否正在使用任何会话信息?SignOut()只影响页面的新实例。当你回去的时候,你被授权去那里(以前)。允许回发,除非您对请求的cookie/session/authenticity进行了代码检查。它甚至绕过了global.asax,因为ViewState已经生成

您可能希望添加一个会话终止语句,或者在基类中提供一些额外的身份验证检查,以确保用户在其所在的位置和所在的位置都得到了真正的授权


或者,您可以关闭页面缓存,这会使“后退”按钮变得毫无用处(它将提供页面过期的默认设置)。这会让依赖“后退”按钮的用户感到奇怪,但这有助于保证页面的安全性,因为它首先会强制“重新呈现”页面。

清除会话可能会有所帮助。以下是我的注销方法:

    public ActionResult Signout()
    {
        Session.Clear();
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home");
    }

我认为问题在于浏览器会缓存页面。这就是为什么在你点击后退按钮后它不会重新加载页面。如果在页眉中指定不应缓存页面,则应在单击“上一步”按钮后重新加载页面。然后用户被拒绝

然而,在某些情况下,让它工作起来可能很棘手。
有关更多信息,请参见此。

这是一个迟来的答案,但我希望能在一段时间内帮助任何人 在Global.asax中添加此方法

protected void Application_BeginRequest()
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
    Response.Cache.SetNoStore();
}
然后在主操作之后添加此检查

if (Request.IsAuthenticated)
{
    // do something
}
else 
{
    return RedirectToAction("LoginPage", "ControllerName");
}
(主操作指任何
[httpget]
操作)
这将非常有效,我希望能提供帮助

您是否忘记将[Authorize]包装在接受帖子的操作周围(在[AcceptVerbs(HttpVerbs.post)]?没有,但当我回去看时,我看到的是这样的:[AcceptVerbs(HttpVerbs.Get)][Authorize(Roles=“Administrator”)]和[AcceptVerbs(HttpVerbs.post)][Authorize(Roles=“管理员”)]当我在Get和Post的AcceptVerbs之前放置Authorize标志时,它仍然允许我返回表单,但不允许我发布。我仍然希望它不显示安全表单是否允许它发回。这是一个奇怪的问题。使用[Authorize]装饰我不应该测试是否已验证,是吗?如果(!User.Identity.IsAuthenticated){return RedirectToAction(“LogOn”,“Account”);}这可能是页面缓存问题吗?如果是,您需要添加标题以导致页面过期。他使用的是MVC,因此回发和视图状态不应该是问题。使用
Session.about()
在注销控件上设置是个好主意。在这种情况下,我不使用会话信息。