用了mvc这么久,有时候会出现下边的问题,之前没留言,现在想解决
所需的防伪+Cookie“__RequestVerificationToken”不存在。
我页面里用了@Html.AntiForgeryToken() 方法。cs代码里用了[ValidateAntiForgeryToken]
有没有人和我遇到同样的问题啊,不是经常出现,只是偶尔在某页面会出现这样的错误,多数页面是正常的,如果弃掉ValidateAntiForgeryToken 又不安全,求高手如何解决!!!!!!!!!!!!!
data: { "Id": $("#id").val(),'__RequestVerificationToken':$('input[name=__RequestVerificationToken]').val() },
不是这个原因,是因为缓存的原因, 因为有缓存,所以生成页面的时候没有执行页面里的内容,所以cookie里取不到
这个隐藏域会出现在页面中,你可以通过查看源文件有没有,用fiddler监视请求报文,看看__RequestVerificationToken有没有在里面。
非常你的回答。
我可能找到原因了,可能是因为缓存了视图的原因,再重新获取页面的时候,@Html.AntiForgeryToken() 就没有执行,没有生成cookie,不过我还不确定是不是这个原因,但现在可以说服我,我觉得。
@anech: 你的猜测很有道理~
问题解决了吗,我也遇到和你一样的问题,在内网是没问题,外网就不行了
就是我说的那个原因,因为加了缓存,所以页面里的__RequestVerificationToken一直没变,但是action有缓存,所以在第二次执行的时候,没用执行,cookie也就没有写入__RequestVerificationToken,在页面提交时就出现了异常
在请求之前将request的cookie信息 copy到response中。已解决
具体代码是怎么样的?
@马甲线: 在需要的地方调用:
private void SetResponseVerify()
{
var res = Response.Cookies["__RequestVerificationToken"];
var req = Request.Cookies["__RequestVerificationToken"];
if (res == null || string.IsNullOrEmpty(res.Value))//set Response
{
if (req != null && !string.IsNullOrEmpty(req.Value))
{
res = new HttpCookie("__RequestVerificationToken", req.Value);
Response.SetCookie(res);
}
}
}