为每个用户生成不同的AntiForgeryToken的方法是什么

时间:2012-01-02 00:40:12

标签: asp.net-mvc asp.net-mvc-3 security csrf

我正在使用带有Razor视图引擎的MVC3。

我需要为每个用户生成不同的AntiForgeryToken。

我正在考虑生成一个唯一的salt值,并在用户注册时将其存储在users表中,并使用该salt生成令牌,但是如何将该salt值绕过属性ValidateAntiForgeryToken 。我想我需要定义一个自定义属性,但我不知道该怎么做(通过访问用户信息来使用salt值)。

提前致谢。

2 个答案:

答案 0 :(得分:5)

如果你想要一种不同的盐,那么你需要从现有的代码中推出自己的代码或者想出一个新的方案。

但请记住,这些令牌已经是用户特定的。以用户A身份登录的用户无法使用用户B会话中的令牌。

另请注意,他们不是一次使用令牌,所以你想在这里阻止什么?这样,用户A无法为用户b生成一个?再次 - 请记住,用户a未以用户b身份登录,因此如果伪造,则当前完成的检查将失败。

答案 1 :(得分:1)

这是一个非常相似的问题,有一个很好的解决方案:
runtime loading of ValidateAntiForgeryToken Salt value

基本上,您只需要在运行时使用自定义salt值创建包含ValidateAntiForgeryToken属性功能的属性。

该解决方案中的另一个好处:属性可以在Controller级别应用,自动应用于所有POST方法。

然而,正如其他人所说,MVC AntiForgeryToken实现已经使用用户名来生成令牌,所以除非你有别有用心,否则这样做不会给你带来任何好处。