我正在开发一个样本SPA,使用ASP.NET MVC作为后端,Angular 2作为前端。
我按照以下步骤在我的应用程序中阻止了跨站点请求伪造攻击
由于ASP.NET MVC发送一个名为" __ RequestVerificationToken"的cookie,并期望一个名称为#34; __ RequestVerificationToken"在防止CSRF的HTTP请求中,我在我的角度模块中添加了以下代码
{provide: XSRFStrategy, useFactory: xsrfFactory}
其中xsrfFactory低于函数
export function xsrfFactory() {
return new CookieXSRFStrategy('__RequestVerificationToken', '__RequestVerificationToken');
}
以下是控制器动作代码,其中包含" [ValidateAntiForgeryToken]"属性,使用Angular 2的Http服务进行AJAX调用。
[CustomAuth]
[ValidateAntiForgeryToken]
public ActionResult GetAuthors()
{
List<BookStoreAdmin.ViewModels.Author> authors = BookStoreAdmin.BAL.Author.GetAuthors();
BookStoreAdmin.ViewModels.Response<List<BookStoreAdmin.ViewModels.Author>> response = new Response<List<ViewModels.Author>>();
response.success = true;
response.errorMessage = null;
response.data = authors;
return Json(response, JsonRequestBehavior.AllowGet);
}
以下是进行AJAX调用的代码。
loadAuthors(): Observable<AuthorModel[]> {
return this.http.get('http://localhost:57599/author/GetAuthors')
.map((data) => data.json());
}
当我的应用程序使用Http角度服务进行AJAX调用时,我希望它具有名称为&#34; __ RequestVerificationToken&#34;的请求标头。 , 但是这个 标题丢失,任何想法可能是什么原因?
如果需要提供更多信息,请告诉我?
答案 0 :(得分:0)
我无法看到你是否在angular2 http调用中传递了一个标题。
您可以使用RequestOptions API来添加 header
。在您发出请求后添加标头后,ValidateAntiForgeryToken
应该能够接收已发送的标头。
在此处阅读 RequestOptions
的更多内容:
https://angular.io/docs/ts/latest/api/http/index/RequestOptions-class.html
答案 1 :(得分:0)
迟到的答案,但可能对某人有用。
我认为标头未设置,因为这是一个GET请求。虽然这是Angular 2,但角度4 security docs可能与此相关,因为它们表示
默认情况下,拦截器会将所有变更请求(POST等)上的cookie发送给相对URL,但不会发送给GET / HEAD请求或带有绝对URL的请求。
为了在@micronyks中明确将此标头包含为his answer个状态,您可以使用RequestOptions API。这是一个代码示例
var headers = new Headers();
headers.append('__RequestVerificationToken', <token>);
return this.http.get(url, {headers: headers});