web-dev-qa-db-ja.com

ASP.NET Web APIの認証

新しいASP.NET Web APIを作成しましたが、問題はありません。 APIを保護したいところです。

[Authorize]属性をベースコントローラーの上に配置しましたが、ASP.NETアプリケーション自体の中でAPI呼び出しを行いたい場合は、適切に機能しています。

しかし、疑問に思っているのは、API呼び出しを行い、承認を通過したい外部クライアントのベストプラクティスは何ですか?また、カスタム認証ロジックがあることも覚えておいてください。

クライアントはどのように資格情報を送信する必要がありますか?これらの資格情報はどの時点で処理しますか?

20
Adam Levitt

クライアントの資格情報をどのように送信する必要がありますか?

認証情報を送信するデフォルトの場所は、authorizationヘッダーです。これを基本認証だけでなく、他のタイプの認証(JWT、Bearerなど)にも使用できます。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

たとえば、リクエストに基本認証ヘッダーを追加するには、クライアントで次のコードを使用できます。

WebRequest request = (HttpWebRequest)WebRequest.Create("https://yoururl");
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes("user:password")));

これらの資格情報はどの時点で処理しますか?

私はDelegatingHandlerを書き、それを使用して「プリンシパル」を解決します。次に、それをHttpContext.CurrentPrincipalに設定して、リクエストのスコープ内で必要なときにいつでも使用できるようにすることができます。 DelegatingHandlerは、下の図に示すようにコントローラーの前に呼び出されるため、認証ロジックに最適です。

enter image description here

クライアントでも同じようにして(DelegatingHandlerまたはActionFilterAttributeを書き込んで)、デフォルトの場所に認証ヘッダーを追加します。 DelegatingHandlersはHTTPパイプラインの一部であり、ActionFilterAttributesはMVCパイプラインに属していることに注意してください。

最後に重要なことですが、独自のカスタム認証ロジックを作成せずに、デフォルトのフレームワークから1つに固執することをお勧めします。これは、HTTPS経由の基本認証を使用するのと同じくらい簡単で、OAuthの実装と同じくらい複雑です。しかし、私はそれを自分で解決することは避けます。

私もあなたに見てもらいたいと思いました この答え 私は類似の質問に与えました。

注:ASP.NET Web APIはRESTに基づいているため、セッション情報を保持したくない場合があります。

編集:基本認証を処理するdelegatinghandlerを実装する方法の例については、次を参照してください: asp.net Web APIでの基本的なhttp認証メッセージハンドラー

20
Jos Vinke

基本的には、ユーザー名とパスワードをネット経由でサーバーアプリケーションに送信し、APIにランダムセッションIDを生成させてリスト(サーバーサイド)に保持させ、IDをクライアントに送り返すことができます。これで、クライアントがサーバーに何かを送信するたびに、受信したIDをパケットに含めて、サーバーが毎回それを確認できるようにします。

クライアントの切断または固定タイムアウト時に、サーバーリストからIDを削除し、クライアントに再認証を要求できます。

3
Chuk Ultima