2

Salt考虑使用指令中的参数的 ASP.NET MVC 应用程序[ValidateAntiForgeryToken]

这种情况下,该应用程序将被许多客户使用。Salt在编译时拥有已知信息并不是非常可取的。

当前的策略是在 web.config 中定位 Salt 值。

[ValidateAntiForgeryToken(Salt = Config.AppSalt)]
//Config.AppSalt is a static property that reads the web.config.

这会导致编译时异常,表明Salt在编译时必须是 const。

属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式

如何修改应用程序以允许运行时加载,Salt以便不必为每个客户重新加盐和重新编译应用程序?

考虑到Salt不会经常更改(如果有的话),从而消除表单无效的可能性

4

2 回答 2

6

Salt 属性是编译时常量。它只是一种将特定表单链接到特定操作方法的方法。例如,如果您有一个登录表单,您可能希望对此表单使用盐“登录”,以便对登录表单有效的令牌不能用于更改密码表单等。

在所有情况下,应用程序的机器密钥都会自动用作附加的盐值。因此,一个应用程序的反 XSRF 令牌不能用于另一个应用程序,即使两个盐值都读取“登录”。机器密钥可在 Web.config <machineKey>部分中设置。

于 2010-06-08T08:31:08.927 回答
6

我要求为不同的客户提供不同的盐。在这种情况下,我使用 Dixin 的解决方案在运行时注入盐。

ASP.NET MVC 和 AJAX 的防伪请求配方在标题为“在运行时指定非常量盐”的部分。

用一个新属性装饰你的控制器:

[ValidateAntiForgeryTokenWrapper(HttpVerbs.Post)]
public class ProductController : Controller
{     
    // Only HTTP POST requests are validated.
}

这个新属性定义为:

public class ValidateAntiForgeryTokenWrapperAttribute : FilterAttribute, IAuthorizationFilter
{
    public ValidateAntiForgeryTokenWrapperAttribute(HttpVerbs verbs)
    {
        this._verbs = new AcceptVerbsAttribute(verbs);
        this._validator = new ValidateAntiForgeryTokenAttribute()
            {
                //load from web.config or anywhere else
                Salt = Configurations.AntiForgeryTokenSalt
            };
    }

    // Other members.
}
于 2010-07-21T15:32:50.650 回答