@ Html.AntiForgeryToken()
呈现隐藏的输入
呈现隐藏的输入
<input name="__RequestVerificationToken" type="hidden" value="GuiNIwhIJZjINHhuS_8FenaFDXIiaE" />
public static IHtmlString AntiForgeryTokenValue(this HtmlHelper htmlHelper) { var field = htmlHelper.AntiForgeryToken().ToHtmlString(); var beginIndex = field.IndexOf("value=\"") + 7; var endIndex = field.IndexOf("\"",beginIndex); return new HtmlString(field.Substring(beginIndex,endIndex - beginIndex)); }
解决方法
MVC的反CSRF功能实际上取决于两个令牌:一个是隐藏的表单元素,另一个是cookie。所以Html.AntiForgeryToken()帮助器不只是返回一个HTML片段。它也有一个副作用设置这个cookie。请注意,cookie值和表单值不相等,因为它们各自编码不同的信息。
如果您使用AntiForgery.GetTokens API,则此方法将返回原始令牌,而不是生成HTML代码段。该方法的参数有:
> oldCookieToken:如果请求已经包含反CSRF cookie令牌,请在此处提供。此参数可能为null。
> newCookieToken(out参数):如果oldCookieToken为null或没有表示有效的反CSRF cookie令牌,则此参数将使用您应该放在响应cookie中的值来填充。如果oldCookieToken表示一个有效的反CSRF令牌,那么当该方法返回时,newCookieToken将包含null,并且您不必设置响应cookie。
> formToken(out参数):当返回到服务器时,此参数将使用表单体中应该存在的令牌来填充。这是在调用Html.AntiForgeryToken()时最终被隐藏的输入元素包装的值。
如果您使用此API手动生成cookie和表单令牌,则需要调用AntiForgery.Validate的the corresponding overload才能验证令牌。