2

OpenIdDictを認証に使用するasp.netコアWebアプリケーションがあります。私は認証されていないAjax呼び出しがレスポンス本体に200とログインフォームを返すことに気付きました。 OpenIdDictが要求を処理してから、ASP.NETコアがそれを処理して200を返すので、これを読んだところから期待される動作です。Startup.csで 'UseIdentity()'が呼び出されているため、ASP.NETコアが処理しています。私がOpenIdDictで見たすべての例は、 'UseIdentity'を呼び出しています。私は2つの質問があります。openIdDictでは、Startup.csに 'UseIdentity()'が必要ですか?

  1. ASP.NETコアでリクエストを処理したくない場合は、単に 'UseIdentity()'を削除できますか?私はそれを試して、今は200の代わりに401を取得します。これに何らかの害がありますか、OpenIdDictに 'UseIdentity()'が必要ですか?
  2. UIビューのログインにリダイレクトする機能を失いたくない場合は、これを実行してOnRedirectToLoginを上書きするのが最も簡単で安全な方法ですか?コード例以下:

options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnRedirectToLogin = ctx => { if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == (int) HttpStatusCode.OK) { ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized; } else { ctx.Response.Redirect(ctx.RedirectUri); } return Task.FromResult(0); } };

コードサンプルのソース:ここでは、この問題のhttps://devblog.dymel.pl/2016/07/07/return-401-unauthorized-from-asp-net-core-api/

さらなる議論:https://github.com/aspnet/Security/issues/804

答えて

3

'UseIdentityを()' が必要ですOpenIdDictていますか?

いいえ、app.UseIdentity()によりボンネットの下に登録されたクッキーのミドルウェアは、直接OpenIddictで使用されていないので、OpenIddictが正しく動作するために、このメソッドを呼び出すと、必要とされていません。

つまり、Cookie認証(ほとんどすべてがAccountController/ManageControllerのすべて)に依存するASP.NETコアID機能を使用する場合は、app.UseIdentity()を使用する必要があります。

方法を示している私はOpenIdDictがapp.UseIdentity()を使用していないサンプルについては「UseIdentity」

を呼び出すために、あなたはthe official password flow sampleを見てみましょうかthis blog postを読むことができます見てきた例はすべて、 ASP.NET Core IdentityなしでOpenIddictを使用する

UIビューのログインにリダイレクトする機能を失いたくない場合は、これを実行してOnRedirectToLoginを上書きするのが最も簡単で安全な方法ですか?

これは間違いなく動作しますが、私は個人的にapp.UseIdentity()によって登録されたクッキーのミドルウェアを除外するために分岐パイプラインを使用して構成され、より安全なオプション、を選んだきました。これはあなたのAPIによって返された401の応答をハイジャックからのアイデンティティを防止するだけでなく、HttpContext.Userがクッキーから抽出されたアイデンティティを移入することができないようXSRF攻撃を回避するだけでなく:

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), branch => 
{ 
    branch.UseIdentity(); 
}); 

は、完全なサンプルのためhttps://github.com/openiddict/openiddict-samples/blob/master/samples/CodeFlow/AuthorizationServer/Startup.cs#L141-L158を参照してください。

+0

これは素晴らしいです。ありがとう! – Bloodhound

+0

Core 2.0とOpenIdDict 2.xで同じことを行うためのサンプルプロジェクトやガイドがありますか? – Bloodhound

+1

すべてのOpenIddictサンプルが2.x用に更新されました:https:// github。com/openiddict/openiddict-samplesにあります。残念なことに、パスベースの認証ミドルウェアの選択はもはや2.xではサポートされておらず、[Authorize(AuthenticationSchemes = "Bearer")]アプローチを使用することをお勧めします。詳細についてはhttps://github.com/aspnet/Announcements/issues/262をご覧ください。 – Pinpoint

関連する問題