我已经阅读了文档和所有相关的问题,但是Angular的XSRF机制对我来说仍然不起作用:我无法用自动附加的X-XSRF-TOKEN头发出POST请求。
我有一个角6应用程序与登录表单。
它是Symfony(PHP 7.1)网站的一部分,当Symfony提供Angular应用程序页面时,会发送正确的Cookie(XSRF-TOKEN
):
我的app.module.ts包括正确的模块:
// other imports...
import {HttpClientModule, HttpClientXsrfModule} from "@angular/common/http";
// ...
@NgModule({
declarations: [
// ...
],
imports: [
NgbModule.forRoot(),
BrowserModule,
// ...
HttpClientModule,
HttpClientXsrfModule.withOptions({
cookieName: 'XSRF-TOKEN',
headerName: 'X-CSRF-TOKEN'
}),
// other imports
],
providers: [],
entryComponents: [WarningDialog],
bootstrap: [AppComponent]
})
export class AppModule {
}
然后,在服务的方法中,我发出以下http请求(this.http
是HttpClient
的一个实例):
this.http
.post<any>('api/login', {'_username': username, '_pass': password})
.subscribe(/* handler here */);
post请求从不发送X-XSRF-TOKEN头。为什么?
稍微偏离了主题,但是对于其他来到这里的人来说,我在后端通过以下方式解决了这个问题(对于sping-start
)
/**
* CORS config - used by cors() in configure() DO NOT CHANGE the METDHO NAME
*
* @return
*/
@Bean()
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Lists.newArrayList("http://localhost:4200"));
configuration.setAllowedMethods(Lists.newArrayList("GET", "POST", "OPTIONS"));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Lists.newArrayList("x-xsrf-token", "XSRF-TOKEN"));
configuration.setMaxAge(10l);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
在我的团队中,问题是我们使用的是绝对路径而不是相对路径。
因此,不要使用以下绝对路径:
this.http.post<any>("https://example.com/api/endpoint",data)
使用
this.http.post<any>("api/endpoint",data)
或者使用
this.http.post<any>("//example.com/api/endpoint",data)
这是因为HttpClientXsrfModule上的角度代码显式忽略绝对路径(请参阅)
问题再次在于Angular的糟糕文档。
事实是,Angular将添加X-XSRF-TOKEN
头,只有当XSRF-TOKEN
cookie是在服务器端生成的,并且具有以下选项:
/
false
(这非常重要,而且完全没有文档记录)此外,Angular应用程序和被调用的URL必须位于同一服务器上。
参考:这个Angular Github问题
我必须保护我的Web应用程序不受CSRF的影响,这是一个非常复杂的问题。Net核心MVC web应用程序,客户端为Angular 9。 这是我尝试过的 在Angular应用程序中,我添加了一个http拦截器来提取和发送请求头中的令牌 现在我从服务器收到一个错误的请求错误(400)
我正在编写一个mdp文件,并且我正在寻找一种方法来指定(或修改)客户端为特定演示文稿所做的所有请求的HTTP标头。我想在超文本传输协议请求中添加一个授权字段。我希望在不编辑客户端sw的情况下这样做。 我已经阅读了ISO/IEC 23009-1,但我没有发现任何关于它的信息。有人知道怎么做吗?
我已经为CSRF设置了Spring Boot 1.5. x。在Spring上测试一切正常:(1)服务器生成令牌并发送给客户端(2)如果客户端发送令牌一切正常。 对于web客户端,我有Spring Boot作为rest API(http://localhost:8088/)和angularjs作为客户端(http://localhost:9000),但它接缝的问题是在angularjs上,它在头键X
此外,客户机url http://localhost:8081被添加到KeeyCloak中的Web Origins中。不确定还缺少什么来让它工作。
我使用角1.0.4与ASP. NET MVC4 Web API项目。我试图利用角的CSRF保护,但没有用。我可以看到我正在传递一个名为XSRF-TOKEN的cookie,但是当角尝试在响应中添加名为X-XSRF-TOKEN的标头值时,该值显示为未定义。我试着遵循这里的建议,但是超文本标记语言还没有渲染,所以没有找到元素。 我可能会错过什么?是由ASP生成的RequestVerificationTo
问题内容: 我正在与现有的servlet集成,该servlet从HTTP标头中提取一些属性。基本上,我实现的接口无法访问实际请求,它只能访问HTTP标头的k-> v映射。 我需要传递一个请求参数。计划是使用servlet过滤器从参数到标头值,但是HttpServletRequest对象当然没有addHeader()方法。 有任何想法吗? 问题答案: Extend ,覆盖标头吸气剂以返回参数: ..