この質問は別のスレッドに関連しています。のヘルプと忍耐をもって試したhere: Forms authentication with SignalRを読んで、ASP .NETフォーム認証SignalRハブSignalR:認証を強制する方法/ハブ接続を終了する方法サーバー側
問題の説明:認証されたユーザーだけがSignalR Hubに接続し、メッセージを送受信できるようにしたいと考えています。
侵入のシナリオ:侵入者は潜在的にクライアントコンピュータの一時ファイルにアクセスするWebページのHTMLとJavascriptをキャプチャ/アクセスできます。したがって、この侵入者は、ハブへの接続をセットアップ/使用するために必要なすべての詳細(メソッド、ハブ名など)を知ることができます。 dfowlerから 提案された解決策は、implementing IConnectです:
あなたはIConnectedを実装した場合の接続に次のコードを記述し、新しい例外(「GTFO」)を投げる;(Context.User.Identity.IsAuthenticated!)
そこで私は、この
public System.Threading.Tasks.Task Connect()
{
if (!Context.User.Identity.IsAuthenticated
|| !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2")
))
throw new Exception("User not authorized");
return null;
}
ような何か問題が、一度テストしてみました、Connectメソッドが呼び出されているとき、接続がすでに確立されていることですし、無地の例外をスローすることは助けにはなりません(正しく接続されていれば、接続時にクライアントにメッセージを送信する必要がある場合は、例外をスローするとウェルカムメッセージは送信されません)。
実際、私のテストでは、クライアントは依然としてすべてのメッセージを読むことができます(また送信することもできます)。今
、私の心に来てアプローチ:
- 完璧なソリューション:サーバー側の接続を拒否または終了:SignalRでこれを行う方法がない手がかり(私は方法を見つけることを試みましたAPIしかし切断するクライアントにメッセージを送信するユーザーが彼にメッセージを送信/受信を回避するためにグループの一部である(しかし、これはまだ洪水/ DOS攻撃を受けやすい場合は幸運にも)
- チェック)
- :明らかに私が侵入者と戦っている場合に役立ちません。
他の方法はありますか?サーバー側で接続を終了する方法は、または唯一の実際の認証がホストWebページの1つであることを受け入れる必要があります(すべてのsignalRクライアント攻撃の扉を開いたままにしておきますか?
それはforeverFrameのようになります。私は無条件で例外をスローIConnect.Connect
方法(ブラウザIE9)を使用する場合、サーバ通信 - )
ここでEDIT
は、クライアントのシーケンスであります失敗しますが、longPollingのフォールバックが確立されていて、とにかく動作します。これは、ブロックによってJavascriptでキャプチャされたエラーをスローした後です。
if (connection.state === signalR.connectionState.connecting) {
// Connection hasn't been started yet
throw "SignalR: Connection has not been fully initialized.
Use .start().done() or .start().fail() to run logic after
the connection has started.";
}
SignalR GitHub Projectのサイトで作成された[機能要求](https://github.com/SignalR/SignalR/issues/635) – eddo