この質問は別のスレッドに関連しています。ここで読むことができます:SignalRによるフォーム認証ここでは、ユーザーdfowler の助けと忍耐力を使って、SignalRハブでフォームASP.NETフォーム認証を適用する方法を理解しようとしました。
問題の説明:認証されたユーザーのみがSignalRハブに接続してメッセージを送受信できるようにしたい。
侵入シナリオ:侵入者は、クライアントコンピューター上の一時ファイルにアクセスするWebページのHTMLおよびJavascriptをキャプチャ/アクセスする可能性があります。したがって、この侵入者は、ハブへの接続を設定/使用するために必要なすべての詳細(メソッド、ハブ名など)を知ることができます。dfowlerから提案されたソリューションは、IConnectを実装することです。
IConnectedを実装し、Connectに次のコードを記述しますif(!Context.User.Identity.IsAuthenticated)throw new Exception( "GTFO");
だから私はこのようなもので試しました
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メソッドが呼び出されているときに、接続がすでに確立されており、例外を単純にスローしても役に立たないことです(適切に取得した場合は、Connectを使用して接続時にクライアントにメッセージを送信する必要があります) 、例外をスローすると、送信されないウェルカムメッセージが生成されます)。
実際、私のテストから、クライアントはまだすべてのメッセージを読むことができます(そしてそれらを送信することもできます)。
今、私の頭に浮かぶアプローチ:
- 完璧な解決策:サーバー側で接続を拒否または終了します:SignalRでこれを行う方法の手がかりはありません( APIでメソッドを見つけようとしましたが、運がありませんでした)
- ユーザーがグループに属しているかどうかを確認して、ユーザーへのメッセージの送受信を回避します(ただし、これでもフラッディング/ DOS攻撃を受けやすい)
- 切断するためにクライアントにメッセージを送信する:侵入者と戦っている場合は明らかに役に立ちません。
他のアプローチはありますか?サーバー側で接続を終了する方法、または唯一の実際の認証はホストWebページの1つであると認められる必要があります(すべてのsignalRクライアント攻撃への扉を開いたままにしますか?)
編集
IConnect.Connect
無条件に例外をスローするメソッド(ブラウザーIE9)を使用した場合の、クライアントサーバー通信のシーケンスは次のとおりです。
foreverFrameが失敗したように見えますが、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.";
}