【问题标题】:Anti-Forgery token usage between MVC pages to classic ASP.NET pagesMVC 页面与经典 ASP.NET 页面之间的防伪令牌使用
【发布时间】:2012-02-28 15:07:31
【问题描述】:

我有一个应用程序,其中 80% 是 ASP.NET MVC 2 的一部分。 我正在使用防伪令牌来避免跨站点请求伪造。

说我有一个动作方法 -

public JsonResult AddMenuFavorite(int id) {
    // code
}

它使用令牌来防止 CSRF。我的 MVC 页面中有各种链接,从那里我可以顺利调用此操作方法而不会出现任何错误。

从经典 ASP.NET 页面进行调用时,这会显示错误。

Reason:: Anti-forgery token is not embedded in ASP.NET pages it seems. 

谁能帮我解决一下?

【问题讨论】:

  • 没有 classic ASP.NET pages 它被称为 WebForms,或者 Classic ASP 女巫是一种脚本语言和不使用 .NET Framework。
  • @balexandre 感谢您的指正!

标签: asp.net asp.net-mvc


【解决方案1】:

为了生成包含令牌的所需隐藏字段,您可以使用AntiForgery.GetHtml 静态方法:

<%@ Page Language="C#" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= AntiForgery.GetHtml() %>
        <asp:LinkButton 
            runat="server" 
            ID="btn" 
            PostBackUrl="~/SomeController/AddMenuFavorite/123" 
            Text="Go to the MVC site" 
        />
    </div>
    </form>
</body>
</html>

由于您的操作返回 JSON,我怀疑您使用 AJAX 请求调用它。在这种情况下,您可以使用助手生成的隐藏字段的值将其与 AJAX 请求一起发送:

$(function() {
    $('#someLink').click(function() {
        $.post(this.href, $('form').serialize(), function(result) {
            // do something with the result
        });
        return false;
    });
});

【讨论】:

  • 使用on,即使不需要使用DOM 准备好的类似语法包装点击:$(document).on('click', '#someLink', function() { ... }); :)
  • @balexandre,通常我将脚本放在页面末尾,就在关闭 &lt;/body&gt; 标记之前,所以无论如何我从不使用 document.ready。使用.on 方法的原因是它订阅了对文档的更改,并且当添加了具有给定ID 的元素时,它会自动附加点击事件。那挺好的。只是可能不需要监听 DOM 更改,如果不需要,我会避免它。
  • @DarinDimitrov - Web 表单中无法识别 AntiForgery。我尝试导入命名空间 System.Web.Helpers,但“Helpers”本身没有被识别。
  • @Ashish,您必须添加对System.Web.WebPages 程序集的引用。命名空间是:System.Web.Helpers。但我认为您在同一个 ASP.NET 应用程序中使用了 2。不是这样吗?如果不是,您还必须确保这 2 个应用程序具有相同的机器密钥设置,否则 WebForms 应用程序生成的防伪令牌可能无法被 ASP.NET MVC 3 应用程序成功解密。
  • @DarinDimitrov - 我关注并添加了对 assemble 和进一步的引用。但这对我根本不起作用。如果您需要更多信息,请告诉我。
猜你喜欢
  • 2012-03-15
  • 2019-06-13
  • 2015-07-07
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2014-04-26
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多