【问题标题】:AntiForgeryToken doesn't validate across sub project of same solutionAntiForgeryToken 不在同一解决方案的子项目中验证
【发布时间】:2020-01-10 21:15:37
【问题描述】:

我正在 MVC 应用程序中实现 CSRF。我创建了自定义属性来验证令牌,因为我的输入是 json 编码并由 Ajax 调用。它在同一个项目中工作正常,但是当任何按钮或链接在同一解决方案中跨不同项目调用 url 时,它不会验证令牌。例如注销在主页中并在同一解决方案中调用不同项目的控制器。它继续抛出“防伪cookie令牌和表单字段令牌不匹配”。我已经在网络配置中设置了机器密钥。请各位大神帮我解决一下这个问题。

谢谢

注销方法 - 主项目中的 main.js 文件

A.ajax({
                    url: config.authenticationUrl + '/Account/LogOff',
                    method: 'POST',
                    data: serialisedExtent,
                    contentType: 'application/json',
                    headers: {
                        '__RequestVerificationToken': $('input[name=__RequestVerificationToken]').val()
                    }
                })

认证项目中账户控制器中的控制器方法

[HttpPost]
        [ValidateHeaderAntiForgeryToken]
        public async Task<ActionResult> LogOff([ModelBinder(typeof(JsonNetModelBinder))] Exten extent)
        {
            if (User != null &&
                User.Identity != null &&
                User.Identity.IsAuthenticated)
}

public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            var httpContext = filterContext.HttpContext;
            var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
            AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]);
        }

错误:

防伪cookie令牌和表单字段令牌不匹配。] [异常:System.Web.Mvc.HttpAntiForgeryException(0x80004005): 防伪 cookie 令牌和表单字段令牌不匹配。在 System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext、IIdentity 身份、AntiForgeryToken sessionToken、 AntiForgeryToken fieldToken) 在 System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext、字符串 cookieToken、字符串 formToken)在 ValidateHeaderAntiForgeryTokenAttribute.OnAuthorization(AuthorizationContext filterContext) 在 System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext、IList`1 过滤器、ActionDescriptor actionDescriptor) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c__DisplayClass3_1.b__0(AsyncCallback asyncCallback,对象 asyncState)] [方法:] [调用者:] [上下文: ]

【问题讨论】:

    标签: javascript c# json ajax model-view-controller


    【解决方案1】:

    尝试在您的解决方案中配置所有应用程序以指定相同的ApplicationDiscriminator 值:

    var dataProtectionBuilder = services.AddDataProtection(configure =>
    {
        configure.ApplicationDiscriminator = "SharedAppName";
    });
    

    唯一区分此应用程序的标识符 机器上的其他应用程序。鉴别器值为 隐含在数据生成的所有受保护有效载荷中 保护系统隔离多个逻辑应用程序,所有 碰巧使用了相同的密钥材料。

    如果两个不同的应用程序需要共享受保护的负载,它们 应确保此属性在两者中设置为相同的值 应用程序。

    【讨论】:

    • 您好 Jan,感谢您的回复。我不确定在哪里设置。
    • 我想我可能(错误地)假设您的代码使用的是 asp.net 核心。在 asp.net core 中,您将在 ConfigureServices() 方法中配置数据保护。如果您的代码使用旧版本的 asp.net,我不知道如何设置共享数据保护。
    • 没问题。谢谢简
    【解决方案2】:

    我今天遇到了同样的问题。 Ajax 请求在同一域上运行的不同 .NET Framework IIS 应用程序之间传递。

    This blog post 给了我解决问题的方法:在每个应用程序的 Global.asax.cs 的 Application_Start 中,将 AntiForgeryConfig.CookieName 设置为相同的固定值。

    如果没有这个,每个应用都会使用不同的 cookie 来保存验证令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多