1

背景

我需要使用 WebForms 页面(托管在 cms 中)中的 AntiForgeryToken。该页面应将数据发布到作为解决方案一部分的 MVC 2.0 操作。该操作应使用 ValidateAntiForgeryToken 属性。

我确实从这里尝试了解决方案:Using an MVC HtmlHelper from a WebForm但它似乎不起作用,因为渲染的 antiforgerytoken 在控制器操作中被指示为无效。

当前解决方案

现在我已经解决了这个问题,这样我就有了一个可用的操作来渲染一个部分视图,该视图只包含一个带有防伪标记的输入标签。

看法

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.AntiForgeryToken() %>

该页面使用 javascript 将 antiforgerytoken 拉入如下形式:

形式

<form id="jsonForm" action="/my/action" method="post">
  <input id="tokenPlaceholder" type="hidden" />

获取防伪令牌

<script type="text/javascript">
    $(function () {
        $.ajax({
            url: "/antiforgery/token",
            type: "GET",
            success: function (data, textStatus, jqXHR) {
                $("#tokenPlaceholder").replaceWith(data);
            }
        });
    });
</script>

只要表单发布根据 ValidateAntiforgeryToken 属性有效,这将起作用。

问题

以这种方式将防伪令牌添加到表单中是否存在任何安全问题?

有没有更简单的方法我不干?

4

1 回答 1

0
 <script>
@functions{
    public string TokenHeaderValue()
    {
        string cookieToken, formToken;
        AntiForgery.GetTokens(null, out cookieToken, out formToken);
        return cookieToken + ":" + formToken;                
    }
}

$.ajax("/antiforgery/token", {
    type: "post",
    contentType: "application/json",
    data: {  }, // JSON data goes here
    dataType: "json",
    headers: {
        'RequestVerificationToken': '@TokenHeaderValue()'
    }
});
 </script>

处理请求时,从请求标头中提取令牌。然后调用 AntiForgery.Validate 方法来验证令牌。如果令牌无效,Validate 方法将引发异常。

 void ValidateRequestHeader(HttpRequestMessage request)
 {
   string cookieToken = "";
   string formToken = "";

IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
    string[] tokens = tokenHeaders.First().Split(':');
    if (tokens.Length == 2)
    {
        cookieToken = tokens[0].Trim();
        formToken = tokens[1].Trim();
    }
}
AntiForgery.Validate(cookieToken, formToken);
}

在原始帖子中了解更多信息

于 2014-07-03T00:50:14.267 回答