"后退"按钮和防伪令牌

Whi*_*uit 21 asp.net-mvc razor

我得到了Runtime error与防伪属性相关的信息.

执行以下步骤:

  1. 创建一个MVC Web应用程序并启动
  2. 注册joe@acme.org
  3. 登出
  4. 注册jane@acme.org
  5. 登出
  6. joe@acme.org身份登录
  7. 点击后退按钮
  8. 登录jane@acme.org

错误: The provided anti-forgery token was meant for a different claims-based user than the current user.

可以采取哪些措施来防止发生此错误?

jul*_*gon 32

我刚才遇到了同样的问题,并通过禁用登录视图的缓存来解决它.它实际上很有意义,并且不需要代码或异常处理.

我的登录控制器方法现在看起来像这样:

[AllowAnonymous]
[OutputCache(NoStore = true, Location = OutputCacheLocation.None)]
public ActionResult LogOn(Uri returnUrl)
Run Code Online (Sandbox Code Playgroud)

当禁用缓存并且用户单击浏览器上的后退按钮时,将向服务器发出新请求,并再次传递页面,并将防伪签名设置为正确的用户.

我觉得这是一个更清洁,更简单和合理的方法来解决问题.


Row*_*man 23

这是忽略错误并将用户返回登录屏幕的一种方法.这只是一个例子.

创建一个名为HandleAntiforgeryTokenErrorAttributeinherited 的新类HandleErrorAttribute.覆盖该OnException方法.

public class HandleAntiforgeryTokenErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary(new { action = "Login", controller = "Account" }));
    }
}
Run Code Online (Sandbox Code Playgroud)

转到您的FilterConfig班级并将该属性注册为全局过滤器.

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new HandleAntiforgeryTokenErrorAttribute()
            { ExceptionType = typeof(HttpAntiForgeryException) }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的更新.因此,上面的代码很好地处理错误.但愿意知道,正确的方法是什么?由于用户已经登录.但它将我重定向到登录.从那里我可以在没有登录的情况下浏览任何页面.希望你有功能问题. (3认同)