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