[英]SignalR: how to enforce authentication/terminate hub connections server side
這個問題與另一個線程有關,您可以在這里閱讀:使用SignalR進行表單身份驗證 ,我在用戶dfowler的幫助和耐心下嘗試了解如何在SignalR Hub上強制執行ASP .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方法時,連接已經建立並且普通拋出異常將無濟於事(如果我得到了正確的實際連接應該用於在連接時向客戶端發送消息)拋出異常只會產生一條未發送的歡迎消息 )。
事實上,從我的測試中,客戶端仍然可以讀取所有消息(並發送它們)。
現在,我想到的方法:
還有其他方法嗎? 任何方式終止服務器端的連接或應該接受唯一真正的身份驗證是主機網頁之一(打開所有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.";
}
我們有一個問題,我們需要允許完全阻止連接。 現在你必須保護每種方法。 這不是最干凈的,但對於1.0 alpha1,我們將有一些機制來做到這一點。
另一個問題是,所有集線器的連接都是相同的,因此您無法拒絕特定集線器的連接。
編輯
實際上,如果你拋出它確實結束了我的測試的連接。 你看到了什么行為?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.