Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AntiForgeryToken不';t验证同一解决方案的子项目_Javascript_C#_Json_Ajax_Model View Controller - Fatal编程技术网

Javascript AntiForgeryToken不';t验证同一解决方案的子项目

Javascript AntiForgeryToken不';t验证同一解决方案的子项目,javascript,c#,json,ajax,model-view-controller,Javascript,C#,Json,Ajax,Model View Controller,我正在MVC应用程序中实现CSRF。我创建了自定义属性来验证令牌,因为我的输入是json编码和Ajax调用。它在同一个项目中运行良好,但当任何按钮或链接在同一解决方案中的不同项目中调用url时,它不会验证令牌。例如,在主页中注销,并在同一解决方案中调用不同项目的控制器。它不断抛出“防伪cookie令牌和表单字段令牌不匹配”。我已经在web配置中设置了机器密钥。你们能帮我解决这个问题吗 多谢各位 注销方法-主项目中的main.js文件 A.ajax({ ur

我正在MVC应用程序中实现CSRF。我创建了自定义属性来验证令牌,因为我的输入是json编码和Ajax调用。它在同一个项目中运行良好,但当任何按钮或链接在同一解决方案中的不同项目中调用url时,它不会验证令牌。例如,在主页中注销,并在同一解决方案中调用不同项目的控制器。它不断抛出“防伪cookie令牌和表单字段令牌不匹配”。我已经在web配置中设置了机器密钥。你们能帮我解决这个问题吗

多谢各位

注销方法-主项目中的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"]);
        }
[HttpPost]
[ValidateHeaderAntiForgeryToken]
公共异步任务注销([ModelBinder(typeof(JsonNetModelBinder))]扩展范围)
{
如果(用户!=null&&
User.Identity!=null&&
User.Identity.IsAuthenticated)
}
公共密封类ValidateHeaderAntiForgeryTokenAttribute:FilterAttribute,IAAuthorizationFilter
{
授权时的公共无效(AuthorizationContext filterContext)
{
如果(filterContext==null)
{
抛出新ArgumentNullException(“filterContext”);
}
var httpContext=filterContext.httpContext;
var cookie=httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
AntiForgery.Validate(cookie!=null?cookie.Value:null,httpContext.Request.Headers[“\uu RequestVerificationToken”]);
}
错误:

防伪cookie令牌和表单字段令牌不匹配。] [异常:System.Web.Mvc.HttpAntiforyException(0x80004005): 防伪cookie令牌和表单字段令牌不匹配。位于 System.Web.Helpers.AntiXsrf.TokenValidator.ValidateTokens(HttpContextBase httpContext、身份标识、AntiForgeryToken sessionToken、, AntiForgeryToken(fieldToken)位于 System.Web.Helpers.AntiXsrf.AntiForgeryWorker.Validate(HttpContextBase httpContext、字符串cookieToken、字符串formToken)位于 验证HeaderantiforgeryTokenAttribute.OnAuthorization(AuthorizationContext 筛选器上下文)在中 System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext、IList`1筛选器、ActionDescriptor(ActionDescriptor) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c\uu DisplayClass3\u1.b\u0(异步回调 asyncCallback,Object asyncState)][method:][caller:][context: ]


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

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

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


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

为我提供了问题的解决方案:在每个应用程序的Global.asax.cs的
Application\u Start
中,将
AntiForgeryConfig.CookieName
设置为相同的固定值


如果没有这一点,每个应用程序都使用不同的cookies来保存验证令牌。

Hi Jan,谢谢你的回复。我不知道该在哪里设置。我想我可能(错误地)认为你的代码使用的是asp.net core。在asp.net core中,你应该在
ConfigureServices()中配置数据保护
方法。如果您的代码使用较旧版本的asp.net,我不知道如何设置共享数据保护。没问题。谢谢
var dataProtectionBuilder = services.AddDataProtection(configure =>
{
    configure.ApplicationDiscriminator = "SharedAppName";
});