什么错误可能导致错误:未提供所需的防伪令牌或该令牌无效

本文关键字:令牌 错误 无效 什么 | 更新日期: 2023-09-27 18:21:23

我的问题与此问题非常相似:AntiForgery异常:未提供或无效所需的防伪令牌但我已经安装了MVC3和我使用Razor。

控制器有

[ValidateAntiForgeryToken]

指定

在html中使用@Html.AntiForgeryToken() 打印<input name="__RequestVerificationToken"...

此外,我还观察到,如果我在浏览器中删除授权cookie,并且控制器方法没有[Authorize],我对AntiForery没有任何问题。为什么?

什么错误可能导致错误:未提供所需的防伪令牌或该令牌无效

检查您的cookie,确保您看到requestVerificationToken cookie设置正确。我以前遇到过这种情况,网站的cookie都设置为仅SSL,我试图在本地通过常规HTTP运行它,所以cookie从未被接受,因为它是通过不安全的通道传输的。

对我来说,这意味着要将web.config中system.web/httpCookies下的一行更改为requireSL="false"。。。但是,如果你没有看到这一点,我仍然会查看系统中可能干扰你的cookie的事情(例如,会话重置、在某个地方手动清除cookie等)。如果你在控制器方法上正确地设置了验证属性,并且仍然得到了验证,那么很可能是由于修改或删除了cookie!

编辑:此外,如果您在控制器上有这个,而不是只在POST方法上,这就是为什么。。。这仅适用于将POST表单发送到服务器。

这里有一个简单的自定义版本,您可以将其应用于将在所有POST操作方法上自动验证的表单:

/// <summary>
/// Custom Implementation of the Validate Anti Forgery Token Attribute.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    /// <summary>
    /// The ValidateAntiForgeryTokenAttribute.
    /// </summary>
    private readonly ValidateAntiForgeryTokenAttribute _validator;
    /// <summary>
    /// The AcceptVerbsAttribute.
    /// </summary>
    private readonly AcceptVerbsAttribute _verbs;
    /// <summary>
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class.
    /// </summary>
    /// <param name="verbs">The verbs.</param>
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs) : this(verbs, null)
    {
    }
    /// <summary>
    /// Initializes a new instance of the <see cref="CustomValidateAntiForgeryTokenAttribute"/> class.
    /// </summary>
    /// <param name="verbs">The verbs.</param>
    /// <param name="salt">The salt.</param>
    public CustomValidateAntiForgeryTokenAttribute(HttpVerbs verbs, string salt)
    {
        _verbs = new AcceptVerbsAttribute(verbs);
        _validator = new ValidateAntiForgeryTokenAttribute
                         {
                             Salt = salt
                         };
    }
    /// <summary>
    /// Called when authorization is required.
    /// </summary>
    /// <param name="filterContext">The filter context.</param>
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        var httpMethodOverride = filterContext.HttpContext.Request.GetHttpMethodOverride();
        var found = false;
        foreach (var verb in _verbs.Verbs)
        {
            if (verb.Equals(httpMethodOverride, StringComparison.OrdinalIgnoreCase))
            {
                found = true;
            }
        }
        if (found && !filterContext.RequestContext.RouteData.Values["action"].ToString().StartsWith("Json"))
        {
            _validator.OnAuthorization(filterContext);
        }
    }
}

然后,您可以将以下内容添加到所有控制器中,或者添加到基本控制器中(如果您覆盖并继承其中一个控制器):

    [CustomValidateAntiForgeryToken(HttpVerbs.Post)]

防伪令牌与用户身份绑定。如果在生成和验证令牌之间更改当前登录的用户标识,则令牌将不会成功验证。此外,这也解释了为什么一切都在匿名模式下为您工作。