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

C# 什么错误可能导致错误:未提供所需的防伪令牌或该令牌无效,c#,asp.net,.net,asp.net-mvc,antiforgerytoken,C#,Asp.net,.net,Asp.net Mvc,Antiforgerytoken,我的问题与这个问题非常相似: 但我安装了MVC3和Razor 控制器具有 [ValidateAntiForgeryToken] 指定的 在html中打印检查您的cookie并确保您看到requestVerificationToken cookie设置正确。我以前遇到过这样的情况,站点的cookie都设置为仅SSL,我试图在本地通过常规HTTP运行它,因此cookie从未被接受,因为它是通过不安全的通道传输的 对我来说,这意味着将system.web/httpCookies下的web.confi

我的问题与这个问题非常相似: 但我安装了MVC3和Razor

控制器具有

[ValidateAntiForgeryToken]
指定的


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

对我来说,这意味着将system.web/httpCookies下的web.config中的一行更改为requireSSL=“false”。。。但是,如果这不是您看到的,我仍然会查看可能会干扰系统中cookie的内容(例如会话重置、手动清除某处的cookie等)。如果控制器方法上的validation属性正确,并且仍然得到该属性,则可能是由于修改或删除了该cookie

编辑:此外,如果控制器上有此项,而不是仅在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);
        }
    }
}

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

您提交的每个表单中是否都有
@Html.AntiForgeryToken()
?还是只是漂浮在某个地方?马克是对的。确保AntiForgeryToken帮助程序位于表单标记内。这是标准请求还是Ajax请求?
    [CustomValidateAntiForgeryToken(HttpVerbs.Post)]