如何将Html.AntiForgeryToken添加到ActionLink和RedirectToAction?

时间:2013-09-12 14:32:49

标签: c# html asp.net asp.net-mvc

我在添加AntiForgeryToken时遇到问题。这是我的代码:

<%:Html.ActionLink("Text", "Action", new { ID = "Hello")})%>

 RedirectToAction("Action", "Controller", new { ID = "HelloFromMe"});

控制器:

[ValidateAntiForgeryToken]
public ActionResult Action(String ID){
return View();
}

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:3)

不可能将AntiForgeryToken用于GET方法。

GET方法只应用于服务器上的只读操作。如果您想要执行除了只读操作之外的其他操作,那么您应该使用POST方法。

这里有这个令牌有用的原因,如何以及何时使用它。 http://haacked.com/archive/2009/04/02/anatomy-of-csrf-attack.aspx

答案 1 :(得分:0)

防伪令牌的想法是防止攻击者代表用户生成POST / GET请求。因此,我们在每个POST / GET请求中添加了一些攻击者不知道的特殊内容。

自定义防伪最简单的实现如下所示。 而且它与ValidateAntiForgeryToken一样安全。

std::addressof

查看:

public class ProfileController : AuthorizedAccessController
{
    // GET
    public ActionResult Details(int userId)
    {
        User user = this.Entities.User.First(u => u.Id == userId);

        this.Session["ProfilePageAntiforgery"] = Guid.NewGuid(); // use RandomNumberGenerator to generate strong token 
        this.ViewBag.ProfilePageAntiforgery = this.Session["ProfilePageAntiforgery"];

        return View(user);
    }

    public ActionResult DeleteMyProfile(int userId, string profilePageAntiforgery)
    {
        if ((string)this.Session["ProfilePageAntiforgery"] != profilePageAntiforgery)
        {
            return this.RedirectToAction("Details", new { userId });
        }

        User user = this.Entities.User.First(u => u.Id == userId);
        this.Entities.User.Remove(user);

        this.Entities.SaveChanges();

        return this.RedirectToAction("ProfileDeleted");
    }
}

从中排除定制属性是一个技术问题。 假设一个属性将令牌存储在会话和viewbag中,另一个属性进行验证。

如果无法使用Session(Web场等),则只需将其替换为DB或其他商店即可。