2017-05-17 31 views
6

My WebAPIはUIの消費するためのAPIバックエンドです。実際には、私のUIが使用するWebAPIサービスはおそらく10種類あります。ASP.NET Core WebAPIのセキュリティに関する考慮事項

私はセキュリティの面で何を考慮する必要があるのか​​理解できません。

私のAPIはベアラトークンを使用して保護されており、httpsのみが許可されています。私はCORSを設定しており、彼らは起源を許可するだけですhttps://my-front.endこれはすべて素晴らしい作品です。

しかし、WebAPIでC/XSRFやリプレイ攻撃から保護するにはどうすればよいですか?私はする必要がありますか?

ASP.NET MVCプロジェクトでは、Anti-CSRFを設定するのは簡単ではありませんが、WebAPIプロジェクトでどのように行うことができますか?私は、サーバー上で生成された情報をクライアントに送信することに頼っています。リクエストの本文と別のチャンネル(クッキーやヘッダーなど)を送信します。ノンス(タイムスタンプや乱数など)を使用してリプレイ攻撃から保護できることを読んでいますが、何らかの方法で実装例を見つけることはできません。

私は考慮する必要がありますか?


編集:フロントエンドはvue.jsを使用しますが、任意のフロントエンドの実装が問題になることはありませんので、我々は非常に有能なJSプログラマを持っています。 を見つけ出すだけです。を実行する必要があります。

WebAPIとFrontEndは別々のサーバで動作するため、自明のために、これらは全て原点通話となります。

+0

あなたは、フロントエンドに角のようなものを使用していますか? AngularがCSRFトークンなどのデフォルト設定を持っているので、これをあなたの質問に追加できますか? – MindingData

+0

いいえ、vue.jsです。質問を適切に編集しました。 @MindingData – Mardoxx

+1

OK 1秒。ただあなたのためにそれを働いて:) – MindingData

答えて

3

OKです。最初に、ヘッダーにXSRFトークンを送信する必要があります。これを行うには、ConfigureServicesメソッドに行き、このヘッダーを期待するようにAntiForgeryサービスを設定する必要があります。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddAntiforgery(x => x.HeaderName = "X-XSRF-TOKEN"); 
    services.AddMvc(); 
} 

次に、トークンを生成する必要があります。フロントエンドとAPIは異なるサービスであるため、これを行う際には解決する必要があります。たとえば、ログインしたときや、専用のエンドポイントでこれを行うこともできますが、最終的な結果は同じです。

トークン値をヘッダーに戻すことも、それまでのクッキーを返すこともできます。私の例では、後で説明するCookieを使用しましたが、必要に応じてヘッダーを使用できます。

public class HomeController : Controller 
{ 
    private readonly IAntiforgery _antiForgeryService; 

    public HomeController(IAntiforgery antiForgeryService) 
    { 
     _antiForgeryService = antiForgeryService; 
    } 

    public IActionResult GetToken() 
    { 
     var token = _antiForgeryService.GetTokens(HttpContext).RequestToken; 
     HttpContext.Response.Cookies.Append("XSRF-TOKEN", token, new CookieOptions { HttpOnly = false }); 
     return new StatusCodeResult(StatusCodes.Status200OK); 
    } 
} 

IAntiforgeryサービスが既に使用されることができるはずです(「AddMVC」のそれの一部は、.NETコアサービスで既に使用されます呼び出します)。

これで、トークン値を持つクッキーが返されました。今は、それを送り返すだけでいいのです。ここで

いくつかのjQueryは注意する

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/js-cookie/2.1.4/js.cookie.min.js"></script> 
<script type="text/javascript"> 
    var token = Cookies.get("XSRF-TOKEN"); 

    $.ajax({ 
     url: "/", 
     contentType: "application/json", 
     type: "POST", 
     headers: { 
      "X-XSRF-TOKEN": token 
     } 
    }); 
</script> 

何かを取材をしているAngularJSはこれを自動的に行いますということです。 $ httpが使用されると、 "XSRF-TOKEN"という名前のクッキーが検索され、自動的にヘッダーとして送信されます。あなたがVueを使用しているので、基本的にはこれをやっていますが、もう少し手作業で作業します。

重要な点は、クッキーをCSRFトークンとして戻すように設定しないことです。とにかくCSRFの全目的を敗北させました。

次に、アクション/コントローラをAntiForgery属性で飾ることができます。それは基本的に沸く何結論

​​

:ヘッダー値がトークンCSRFのために使用することを期待する

  • セットアップ.NETコアAntiForgery
  • 手動でトークンを生成しますエンドポイントを持っています
  • フロントエンドにこの値を読み取り、それ以降の要求に保存します。
  • その後の要求でトークンvalを送信しますヘッダ(未クッキー)

として、UEは、ほとんどがここから撮影:http://dotnetcoretutorials.com/2017/05/18/csrf-tokens-angularjsjquery-asp-net-core/

+0

華麗な感謝そんなに!私は次の日にこれを持って行きます。これをよりよく理解するためにCSRFの攻撃がどのように行われたかを知る必要があります。奇妙なことに、トークンをサーバーがフォームに焼き付けるのではなく手動で要求していることが分かります。私はおそらくあなたが不自由な質問をする前に読んでいます:) – Mardoxx

+0

まあ実際には、フォームで焼いて通常の方法は、SPAを使用していない場合(http://dotnetcoretutorials.com/2017/05/17/csrf-トークン - asp-net-core /)。しかし、フォームを作成する際には、Razor HTMLヘルパーを使用する必要があります。あなたはまだフォーム上に隠れたフィールドとして置くことができますが、とにかくSPAを使用しているのであれば意味をなさないでしょう。 – MindingData

+1

ええ、意味があります!すべてのエンドポイントがベアラ認証(oidc)を使用して保護されている場合、これについて心配する必要はありますか?トークンは私たちのjsアプリケーションでリクエストするために追加されます。つまり、ユーザーが 'our.api/protected/endpoint'を呼び出そうとしている悪質なサイトに送られた場合、authトークンは追加されないので何もしません。 – Mardoxx

関連する問題