我必须保护我的Web应用程序不受CSRF的影响,这是一个非常复杂的问题。Net核心MVC web应用程序,客户端为Angular 9。
这是我尝试过的
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
services.AddMvc(option => option.EnableEndpointRouting = false);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
{
app.Use((context, next) =>
{
// CSRF cookie token generation
string path = context.Request.Path.Value;
if (
string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/index.html", StringComparison.OrdinalIgnoreCase))
{
// The request token can be sent as a JavaScript-readable cookie,
// and Angular uses it by default.
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
new CookieOptions() { HttpOnly = false });
}
// CSRF cookie token generation - end
return next.Invoke();
});
}
Controller.cs
[ValidateAntiForgeryToken]
[HttpPost]
public IActionResult ProduceMessage([FromBody] OncRequestData oncRequestData)
{
OncRequestData _OncRequestData = new OncRequestData();
}
在Angular应用程序中,我添加了一个http拦截器来提取和发送请求头中的令牌
export class TokenInterceptorService implements HttpInterceptor {
token: string;
constructor(private xsrfTokenExtractor: HttpXsrfTokenExtractor) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if(req.method == "POST")
{
let xsrfToken = this.xsrfTokenExtractor.getToken();
const authReq = req.clone({ headers: req.headers.set("X-XSRF-TOKEN", xsrfToken) });
return next.handle(authReq);
}else{
return next.handle(req);
}
}
现在我从服务器收到一个错误的请求错误(400)
我通过以下更改临时修复了此问题。
public class AntiforgeryValidationMiddleware
{
private readonly RequestDelegate _next;
public AntiforgeryValidationMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// Validate incoming request for CSRF token
/// </summary>
/// <param name="httpContext"></param>
/// <param name="antiforgery"></param>
/// <returns></returns>
public async Task InvokeAsync(HttpContext httpContext, IAntiforgery antiforgery)
{
try
{
// if the POST request is not from AD2BC call back
if (httpContext.Request.Method == "POST" && !httpContext.Request.Path.Equals("/Home/Auth"))
{
await antiforgery.ValidateRequestAsync(httpContext);
}
await _next(httpContext);
}
catch (AntiforgeryValidationException exception)
{
Log.Error("CSRF token validation failed" + exception.Message);
}
}
}
如果有更好的解决方案,请告诉我
我已经为CSRF设置了Spring Boot 1.5. x。在Spring上测试一切正常:(1)服务器生成令牌并发送给客户端(2)如果客户端发送令牌一切正常。 对于web客户端,我有Spring Boot作为rest API(http://localhost:8088/)和angularjs作为客户端(http://localhost:9000),但它接缝的问题是在angularjs上,它在头键X
我已经阅读了文档和所有相关的问题,但是Angular的XSRF机制对我来说仍然不起作用:我无法用自动附加的X-XSRF-TOKEN头发出POST请求。 我有一个角6应用程序与登录表单。 它是Symfony(PHP 7.1)网站的一部分,当Symfony提供Angular应用程序页面时,会发送正确的Cookie(): 我的app.module.ts包括正确的模块: 然后,在服务的方法中,我发出以下h
Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。 一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。 我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twi
问题内容: 我正在开发DJANGO + AngularJS应用程序,其中django不提供角度部分。 我将角度设置如下: 然后,在执行任何POST之前,我执行GET以设置cookie。我可以通过Chrome确认已设置Cookie: (在Chrome开发者工具的resources / cookies / localhost中可见) 但是,当我执行POST时,没有设置标头 这是Chrome记录的POS
此外,客户机url http://localhost:8081被添加到KeeyCloak中的Web Origins中。不确定还缺少什么来让它工作。
问题内容: 在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头。请注意,必须在Gecko浏览器中调用when。设置_Referer时_ ,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头)。当我设置User-Agent时,它完全搞砸了AJAX调用。但是,设置接受和_内容类型_确实可以。我们是否无法在Firefox 3中