10

この質問は別のスレッドに関連しています。ここで読むことができます: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を使用して接続時にクライアントにメッセージを送信する必要があります) 、例外をスローすると、送信されないウェルカムメッセージが生成されます)。

実際、私のテストから、クライアントはまだすべてのメッセージを読むことができます(そしてそれらを送信することもできます)。

今、私の頭に浮かぶアプローチ:

  1. 完璧な解決策:サーバー側で接続を拒否または終了します:SignalRでこれを行う方法の手がかりはありません( APIでメソッドを見つけようとしましたが、運がありませんでした)
  2. ユーザーがグループに属しているかどうかを確認して、ユーザーへのメッセージの送受信を回避します(ただし、これでもフラッディング/ DOS攻撃を受けやすい)
  3. 切断するためにクライアントにメッセージを送信する:侵入者と戦っている場合は明らかに役に立ちません。

他のアプローチはありますか?サーバー側で接続を終了する方法、または唯一の実際の認証はホストWebページの1つであると認められる必要があります(すべてのsignalRクライアント攻撃への扉を開いたままにしますか?)

編集

IConnect.Connect無条件に例外をスローするメソッド(ブラウザーIE9)を使用した場合の、クライアントサーバー通信のシーケンスは次のとおりです。

Connectが例外をスローしたときのクライアント/サーバー通信

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.";
        }
4

1 に答える 1

5

接続を完全にブロックできるようにする必要があるという問題があります。今のところ、各メソッドを保護する必要があります。これは最もクリーンではありませんが、1.0 alpha1の場合、これを行うためのメカニズムがあります。

もう1つの問題は、すべてのハブで同じ接続であるため、特定のハブの接続を拒否できないことです。

編集

実際、あなたがそれを投げると、私のテストが進む限り、接続は終了します。あなたはどのような行動を見ていますか?

于 2012-09-01T02:43:52.990 に答える