web-dev-qa-db-ja.com

クエリ文字列でトークンを渡さないSignalR(.NET Core)でのJWT認証

ASP .NET Core Web APIアプリケーションでJWT認証トークンを使用しています。トークンはサードパーティではなくAPI自体によって生成されます。SignalRをスタックに正常に追加しましたが、現在はサーバー(ハブ)メソッドを実行しようとしているユーザーを認証する必要があります。誰かがJavaScriptの「qs」プロパティでトークンを渡すことを提案しました。これは私には機能しませんトークンは実際に大規模(多くのクレームが含まれています)ペイロードからトークンを読み取り、ユーザーを自動認証するためのカスタムミドルウェアを作成しようとしました。問題は、WebSocketを使用すると、ミドルウェアが実行されないことです。任意のアイデアが役立ちます。

17
Alin Florin

クエリ文字列の使用を提案する記事をご覧ください JWTを使用してASP.NET Core 1.0(vNext)SignalRアプリケーションに対して認証します 。トークンが長すぎることは承知していますが、作成者はミドルウェアを使用してリクエストを認証する方法を説明しています。

記事の要約は次のとおりです。

  • SignalRには特別な認証メカニズムが組み込まれておらず、標準のASP.NET認証を使用しています。
  • JWTは通常、リクエストのAuthorizationヘッダーで送信されます
  • SignalR JavaScriptクライアントライブラリには、リクエストにヘッダーを送信する手段が含まれていませんが、クエリ文字列を渡すことができます
  • クエリ文字列でトークンを渡すと、トークンを値として使用する認証ヘッダーを追加するミドルウェアを作成できます。 これは、パイプラインのJwtミドルウェアの前に実行する必要があります
  • 「ベアラー」フォーマットに注意してください

カスタムミドルウェアはJwtミドルウェアの前に登録する必要があるという重要なポイントを強調しました。

これから answer WebSocket接続を作成し、トークンを基本認証パラメーターとして渡すことができます。

var ws = new WebSocket($"ws://{token}@example.com/service");
8
Andrii Litvinov