当我使用用户凭据登录时,第一次登录应用程序时没有错误,
但当我注销并再次使用其他用户的凭据登录时,出现错误
提供的防伪令牌是为用户"UserName"提供的,但当前用户是"。
我正在用asp.net mvc 5
实现AntiForgoryToken
和IPrincipal
我试过了:
-
Application_Start()中的
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true;
-
我已经参考了这个链接当尝试注销时,提供的防伪令牌是为用户"提供的;XXXX";,但是当前用户是"用户"
如何修复此错误?
提前谢谢。
我发现我的IIS实例同时启用了匿名和Windows身份验证,这导致了我的应用程序出现此异常
身份验证设置均启用
此设置似乎是导致此异常的原因。ValidateAntiForgeryToken操作筛选器似乎使用了在Anon身份验证中填充了空字符串的当前用户,然后试图将其与使用Win身份验证填充的令牌进行匹配。
通过关闭Windows或匿名身份验证(对于我的应用程序,我关闭了Anon身份验证),令牌现在匹配。
身份验证设置一个启用的
此设置可以在IIS管理器或类似的web.config文件中更改
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false" />
<windowsAuthentication enabled="true" />
</authentication>
</security>
</system.webServer>
您实际上不需要在登录的post方法上检查防欺诈令牌。
反欺诈代币提供保护,免受CSRF攻击。当恶意脚本/链接在您不知情或不同意的情况下代表您发布HTTP请求时,就会发生CSRF攻击。当防伪造令牌嵌入到页面上时,服务器可以在收到请求时检查该令牌,以验证该请求是否确实来自页面。来自恶意脚本或链接的请求将不具有令牌,并且将失败。
因此,您想要保护的所有其他post操作都应该用[Authorize]
和[ValidateAntiForgeryToken]
属性来修饰它们。但是,login-post方法不需要这两个属性中的任何一个
更新:这真的很需要。请参阅Stephen Muecke的评论中的答案。