我在ASP.Net MVC中遇到了防伪标记的问题。如果我在Web服务器上执行iisreset并且用户继续他们的会话,他们将被弹回登录页面。虽然不是很糟糕,但是防伪标记会出问题,唯一的解决方法就是清除浏览器上的cookie。
在版本1的beta版中,当我读取cookie时会出现问题,所以在请求验证令牌之前我需要清除它,但是在正式版发布后这个问题得到了解决。
目前,我认为我会返回到修复beta问题的代码,但我不能帮助自己思考是否有更简单的解决方案,难道我应该放弃他们的辅助程序并从头开始创建一个新的吗?我感觉问题的很大一部分原因是它与旧的ASP.Net流程紧密耦合,并试图让它做一些它本来不应该做的事情。
我查看了ASP.Net MVC 2 RC的源代码,发现代码没有太大改动,因此虽然我还没有尝试过,但我认为那里没有答案。
以下是异常的相关部分的堆栈跟踪信息。
编辑:我刚才意识到我没有提到这只是在GET请求中尝试插入令牌。这不是启动POST验证时发生的验证。
在版本1的beta版中,当我读取cookie时会出现问题,所以在请求验证令牌之前我需要清除它,但是在正式版发布后这个问题得到了解决。
目前,我认为我会返回到修复beta问题的代码,但我不能帮助自己思考是否有更简单的解决方案,难道我应该放弃他们的辅助程序并从头开始创建一个新的吗?我感觉问题的很大一部分原因是它与旧的ASP.Net流程紧密耦合,并试图让它做一些它本来不应该做的事情。
我查看了ASP.Net MVC 2 RC的源代码,发现代码没有太大改动,因此虽然我还没有尝试过,但我认为那里没有答案。
以下是异常的相关部分的堆栈跟踪信息。
编辑:我刚才意识到我没有提到这只是在GET请求中尝试插入令牌。这不是启动POST验证时发生的验证。
System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not
supplied or was invalid.
---> System.Web.HttpException: Validation of viewstate MAC failed. If this
application is hosted by a Web Farm or cluster, ensure that <machineKey>
configuration specifies the same validationKey and validation algorithm.
AutoGenerate cannot be used in a cluster.
---> System.Web.UI.ViewStateException: Invalid viewstate.
Client IP: 127.0.0.1
Port: 4991
User-Agent: scrubbed
ViewState: scrubbed
Referer: blah
Path: /oursite/Account/Login
---> System.Security.Cryptography.CryptographicException: Padding is invalid and
cannot be removed.
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
--- End of inner exception stack trace ---
--- End of inner exception stack trace ---
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
at System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
at System.Web.Mvc.AntiForgeryDataSerializer.Deserialize(String serializedToken)
--- End of inner exception stack trace ---
at System.Web.Mvc.AntiForgeryDataSerializer.Deserialize(String serializedToken)
at System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie(String salt, String domain, String path)
at System.Web.Mvc.HtmlHelper.AntiForgeryToken(String salt, String domain, String path)