簡體   English   中英

SignalR:如何強制認證/終止集線器連接服務器端

[英]SignalR: how to enforce authentication/terminate hub connections server side

這個問題與另一個線程有關,您可以在這里閱讀:使用SignalR進行表單身份驗證 ,我在用戶dfowler的幫助和耐心下嘗試了解如何在SignalR Hub上強制執行A​​SP .NET Forms身份驗證。

問題描述:我希望只有經過身份驗證的用戶才能連接SignalR Hub並接收/發送消息。

入侵場景:入侵者可以捕獲/訪問訪問客戶端計算機上臨時文件的網頁的HTML和Javascripts。 因此,該入侵者可以知道建立/使用與Hub的連接所需的所有細節(方法,集線器名稱等)。 dfowler提出的解決方案是實現IConnect

您將實現IConnected並在Connect if(!Context.User.Identity.IsAuthenticated)中拋出以下代碼拋出新的異常(“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方法時,連接已經建立並且普通拋出異常將無濟於事(如果我得到了正確的實際連接應該用於在連接時向客戶端發送消息)拋出異常只會產生一條未發送的歡迎消息 )。

事實上,從我的測試中,客戶端仍然可以讀取所有消息(並發送它們)。

現在,我想到的方法:

  1. 完美的解決方案:拒絕或終止服務器端的連接: 不知道如何在SignalR中執行此操作 (我試圖在API中找到一個方法,但沒有運氣)
  2. 檢查用戶是否屬於某個組以避免接收/發送消息給他(但這仍然容易發生洪水/ DOS攻擊)
  3. 向客戶端發送消息以斷開連接:如果我正在與入侵者作戰,顯然無濟於事。

還有其他方法嗎? 任何方式終止服務器端的連接或應該接受唯一真正的身份驗證是主機網頁之一(打開所有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.";
        }

我們有一個問題,我們需要允許完全阻止連接。 現在你必須保護每種方法。 這不是最干凈的,但對於1.0 alpha1,我們將有一些機制來做到這一點。

另一個問題是,所有集線器的連接都是相同的,因此您無法拒絕特定集線器的連接。

編輯

實際上,如果你拋出它確實結束了我的測試的連接。 你看到了什么行為?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM