【问题标题】:Using ASP.NET MVC3 AntiForgery token from CCW使用 CCW 的 ASP.NET MVC3 AntiForgery 令牌
【发布时间】:2012-10-15 17:18:43
【问题描述】:

我有一些遗留应用程序当前正在将基本信息发布到 MVC3 表单。我想将其分离到 GET 并传递查询字符串中的值。很容易。但是,我想在请求中添加一个防伪令牌。首先,这似乎是一个不错的选择吗?其次,有没有从非 MVC3 模块到 MVC3 表单实现这种功能的例子?

我的另一种选择是加密查询字符串。

【问题讨论】:

  • 如果您的 new GET 操作将在您的应用程序中执行更改(这是有道理的,因为它们曾经是 POST),您将违反定义的 HTTP-GET 规范W3C,它说 GET 请求必须是安全的和只读的。如果您不遵循这种方法...如果 Google 的抓取工具将您的网站编入索引,您迟早会发现您的应用程序中存在不一致
  • 我同意 Jupaol 的观点,它违反了 http 规范。为什么不在 MVC 中保留作为发布请求?但是,您的非 mvc3 模块将无法拥有 mVC3 使用的适当防伪令牌,因此您将被困在试图找出其他东西的过程中。如果没有状态被改变,那么你不需要防伪,只需要身份验证。
  • 他们没有进行任何修改,这就是我们想要将 POST 移至 get 的原因。 POST 用于隐藏正在传递的值。

标签: c# asp.net asp.net-mvc asp.net-mvc-3 c#-4.0


【解决方案1】:

由 ASP.NET 实现的 Anti-Forgery Token 旨在作为一种防止 CSRF(即 corss-site-request-forgery)的机制,并且仅适用于 HTTP POST

由于您正在实施基于GET 的“API”,因此该令牌将不起作用(注意例如查询字符串长度的限制)。

我不确定您的目标到底是什么...根据您的目标,解决方案是加密或签署查询字符串或两者兼而有之。

【讨论】:

  • 我相信你是对的。我将走加密查询字符串的路线。尽管有很多帖子说不要,但这似乎是我最好的解决方案。谢谢!
【解决方案2】:

您可以在此 mvc3 操作中发布您想要的每个帖子。您只需确保您的 postdata 与服务器端对象匹配。是的,为了安全起见,您必须使用防伪令牌。

在 javascript 中,您可以使用 jQuery 制作例如这样的帖子。如您所见,我不使用表单,而只是使用一些 javascript 代码。 Mvc 可以完美处理。

$.ajax({
    type: 'POST',
    url: urlToYourMvcAction,
    data: {
        name: 'John Doe',
        age: 25
    }, 
    success: successCalback,
    error: errorCallback);

public class Person
{
    public int Id { get; set; }
    public string Name { get; ;set }
    public int Age { get; set; }
}

public class PersonController : Controller
{
    [HttpPost]
    public ActionResult Add(Person person)
    {
          //Your code
    }
}

您可以在旧版应用程序中轻松地使用 c# WebClient 对象发出相同的发布请求。您可以使用 fiddler 或开发者工具来检查请求并传入发布帖子所需的正确参数。

哦,当请求变大时,使用 get 请求会给您带来麻烦。帖子是用来发送数据到服务器的。 Gets 用于从服务器获取数据。

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多