【问题标题】:The provided anti-forgery token was meant for user "UserName", but the current user is ""提供的防伪令牌用于用户“UserName”,但当前用户是“”
【发布时间】:2016-03-19 21:41:15
【问题描述】:

当我使用用户凭据登录时,第一次登录应用程序时没有错误,

但是当我注销并再次使用其他用户的凭据登录时出现错误

提供的防伪令牌用于用户“UserName”,但当前用户是“”。

我正在用asp.net mvc 5 实现AntiForgoryTokenIPrincipal

我试过了:

  1. AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; in Application_Start()

  2. 我已经参考了这个链接When attempt logoff, The provided anti-forgery token was meant for user "XXXX", but the current user is ""

我该如何解决这个错误?

提前致谢。

【问题讨论】:

  • 您是否将 [ValidateAntiForgeryToken] 属性放在您的登录操作中?如果是这样,请尝试将其删除。
  • 是的,我在登录的 post 方法上添加了[ValodateAntiForgeryToken],但在只返回登录页面的 get 方法上没有。

标签: asp.net-mvc-5 antiforgerytoken iprincipal


【解决方案1】:

我发现我的 IIS 实例同时启用了匿名和 Windows 身份验证,这导致我的应用程序出现此异常

Authentication Settings both enabled

此设置似乎是导致此异常的原因。看来 ValidateAntiForgeryToken 操作过滤器正在使用在匿名身份验证中填充了空字符串的当前用户,然后尝试将其与使用 Win 身份验证填充的令牌进行匹配。

通过关闭 Windows 或匿名身份验证(对于我的应用程序,我关闭了匿名身份验证),令牌现在匹配。

Authentication Settings one enabled

可以在 IIS 管理器或 web.config 文件中更改此设置,如下所示

<system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
</system.webServer>

【讨论】:

  • 谢谢你的回答,会试试这个:)。
【解决方案2】:

您实际上不需要在登录的 post 方法上检查防伪令牌。

防伪令牌可防止 CSRF 攻击。当恶意脚本/链接在您不知情或未经您同意的情况下代表您发布 HTTP 请求时,就会发生 CSRF 攻击。当您的页面中嵌入了防伪令牌时,服务器可以在收到请求时检查此令牌,以验证请求确实来自页面。来自恶意脚本或链接的请求将没有令牌并且会失败。

因此,您要保护的所有其他发布操作都应使用[Authorize][ValidateAntiForgeryToken] 属性进行修饰。然而,login post 方法不需要这些属性中的任何一个。

更新:确实需要。请参阅 Stephen Muecke 评论中的答案。

【讨论】:

最近更新 更多