2012-08-28 26 views
10

この質問は別のスレッドに関連しています。のヘルプと忍耐をもって試した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メソッドが呼び出されているとき、接続がすでに確立されていることですし、無地の例外をスローすることは助けにはなりません(正しく接続されていれば、接続時にクライアントにメッセージを送信する必要がある場合は、例外をスローするとウェルカムメッセージは送信されません)。

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

、私の心に来てアプローチ:

  1. 完璧なソリューション:サーバー側の接続を拒否または終了:SignalRでこれを行う方法がない手がかり(私は方法を見つけることを試みましたAPIしかし切断するクライアントにメッセージを送信するユーザーが彼にメッセージを送信/受信を回避するためにグループの一部である(しかし、これはまだ洪水/ DOS攻撃を受けやすい場合は幸運にも)
  2. チェック)
  3. :明らかに私が侵入者と戦っている場合に役立ちません。

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

client-server communication when Connect throws exception

それは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."; 
     } 
+0

SignalR GitHub Projectのサイトで作成された[機能要求](https://github.com/SignalR/SignalR/issues/635) – eddo

答えて

5

接続を完全にブロックする必要があるという問題があります。今すぐあなたはそれぞれの方法を守る必要があります。これは最もクリーンではありませんが、1.0 alpha1ではこれを行うためのメカニズムがあります。

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

EDIT

実際にあなたがそれを限り私のテストが行​​くように、接続を終了しない場合投げます。あなたはどんなふるまいをしていますか?

+0

今は理解していますが、明らかに物事は最初の考えよりも複雑です。しかし、これは主要な問題であり、SignalRは企業アプリケーションには適しておらず、セキュリティ面で大きな脅威となっています.PLはこれに優先順位を与えます... 自動再接続については、質問自体にいくつかの詳細を追加しました - そのような苦痛であることを申し訳ありません:) – eddo

+0

my twopence - ハブに接続するには、クライアントは ''を取得する必要があります。これのサーバー側をASP.NET認証にすることはできないでしょうか?このアプローチがSignalR.Clientにも拡張できるかどうかは確かではありません。 – eddo

+0

これは当てはまりません。これは便宜上生成されたプロキシですが、ハブに接続できるかどうかは関係ありません。追加する必要があるのは、ユーザー定義のロジックに基づいて接続を完全に拒否するきれいな方法です。認証はSignalR自体の中で決して起こらない。しかし、あなたはSignalRで確認して確認することになります。 これを今日稼働させることが本当に必要な場合は、ASP.NETモジュールを作成してシグナルを短くすることができますが、それは痛いことです。 – davidfowl

関連する問題