防止Angular 2 / ASP.NET MVC应用程序中的CSRF

时间:2017-03-10 06:40:06

标签: asp.net-mvc angular csrf-protection

我正在开发一个样本SPA,使用ASP.NET MVC作为后端,Angular 2作为前端。

我按照以下步骤在我的应用程序中阻止了跨站点请求伪造攻击

  1. 由于ASP.NET MVC发送一个名为" __ RequestVerificationToken"的cookie,并期望一个名称为#34; __ RequestVerificationToken"在防止CSRF的HTTP请求中,我在我的角度模块中添加了以下代码

    {provide: XSRFStrategy, useFactory: xsrfFactory}
    
  2. 其中xsrfFactory低于函数

    export function xsrfFactory() {
        return new CookieXSRFStrategy('__RequestVerificationToken', '__RequestVerificationToken');
    }
    
    1. 以下是控制器动作代码,其中包含" [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);
      }
      
    2. 以下是进行AJAX调用的代码。

       loadAuthors(): Observable<AuthorModel[]> {      
      
           return this.http.get('http://localhost:57599/author/GetAuthors')
          .map((data) => data.json()); 
      
       }      
      

      当我的应用程序使用Http角度服务进行AJAX调用时,我希望它具有名称为&#34; __ RequestVerificationToken&#34;的请求标头。 , 但是这个 标题丢失,任何想法可能是什么原因?

    3. 如果需要提供更多信息,请告诉我?

2 个答案:

答案 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});
相关问题