所提供的防伪标记是为用户“UserName”设计的,但当前用户为空。

3
当我使用用户凭据登录时,第一次登录应用程序时没有错误,
但是当我注销并再次使用其他用户的凭据登录时,会出现以下错误:
“提供的防伪令牌是为用户“UserName”而设计的,但当前用户为空。”
我正在使用asp.net mvc 5实现AntiForgeryToken和IPrincipal。
我尝试过:
1. 在Application_Start()中使用AntiForgeryConfig.SuppressIdentityHeuristicChecks = true; 2. 我已经参考了这个链接When attempt logoff, The provided anti-forgery token was meant for user "XXXX", but the current user is "" 如何解决这个错误?
提前致谢。

你在登录操作上是否加了 [ValidateAntiForgeryToken] 属性?如果是的话,尝试将其移除。 - OJ Raqueño
是的,我在登录的POST方法上添加了[ValodateAntiForgeryToken],但没有在GET方法上添加,因为它只返回登录页面。 - gaurav bhavsar
2个回答

2
我发现我的IIS实例同时启用了匿名和Windows身份验证,这导致我的应用程序出现了异常。 同时启用的身份验证设置 这个设置似乎是异常的原因。看起来ValidateAntiForgeryToken操作过滤器正在使用当前用户在Anon身份验证中填充的空字符串,然后尝试将其与使用Win身份验证填充的令牌进行匹配。
通过关闭Windows或匿名身份验证(对于我的应用程序,我关闭了Anon身份验证),令牌现在匹配起来了。 只启用一个身份验证设置 可以在IIS管理器或web.config文件中更改此设置。
<system.webServer>
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
</system.webServer>

谢谢回答,我会尝试的 :)。 - gaurav bhavsar

0

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

防伪令牌可以保护免受CSRF攻击。 CSRF攻击发生在恶意脚本/链接未经您的知情和同意而发布HTTP请求时。当防伪令牌嵌入到您的页面中时,服务器可以在接收请求时检查此令牌,以验证该请求确实来自该页面。来自恶意脚本或链接的请求将没有该令牌并将失败。

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

更新:它确实是必需的。请参见Stephen Muecke的评论中的答案。


有趣!!那么如何保护登录和用户凭据,例如http://security.stackexchange.com/questions/2120/when-the-use-of-a-antiforgerytoken-is-not-required-needed - gaurav bhavsar
2
在登录方法中,您绝对需要令牌,我建议您阅读此答案。 - user3559349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接