提供的防伪令牌适用于用户" UserName",但当前用户是""

时间:2015-12-14 11:59:39

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

当我使用用户的凭证登录时,首次登录应用程序时没有错误,

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

  

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

我正在使用AntiForgoryToken

实施IPrincipalasp.net mvc 5

我试过了:

    Application_Start()

    中的
  1. AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;

  2. 我已经提到此链接When attempt logoff, The provided anti-forgery token was meant for user "XXXX", but the current user is ""

  3. 如何解决此错误?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

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

Authentication Settings both enabled

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

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

Authentication Settings one enabled

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

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

答案 1 :(得分:0)

您真的不需要在登录的post方法中检查防伪令牌。

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

因此,您要保护的所有其他帖子操作都应使用[Authorize][ValidateAntiForgeryToken]属性进行修饰。但是,登录post方法不需要这些属性。

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