2016-11-03 37 views
0

我正在與SignalR搞清楚在當前部署的Intranet MVC應用程序中使用它的很酷的東西。目前的設置是這樣的(除了signalr已經存在):SignalR有MVC IIS客戶端模擬當前Windows用戶

架構:Windows用戶瀏覽器 - >負載平衡MVC的Web應用程序 - > SignalR主機

在此架構下,我想,如果要弄清楚我想用身份驗證的事情是可能的。我想要做的是讓MVC應用程序(當前正在windows服務帳戶下運行)模擬當前登錄到MVC應用程序的windows用戶,而不是自己連接到SignalR集線器。通過這種方式,我可以重新使用我已經構建到MVC應用程序中的身份驗證,以防萬一有些事情我不希望某些用戶調用,或者我想限制某些SignalR操作只允許MVC應用程序在該服務下運行帳戶執行。

我嘗試使用SignalR文檔中指出的下面的示例,但由於默認憑證是服務帳戶的憑證,所以它無法工作在服務器端(顯然)。

var hubConnection = new HubConnection(System.Configuration.ConfigurationManager.AppSettings["fwServiceAddress"].ToString()); 
      hubConnection.Credentials = CredentialCache.DefaultCredentials; 
      IHubProxy customerHub = hubConnection.CreateHubProxy("customer"); 
      await hubConnection.Start(); 
      await customerHub.Invoke("NewNoteAdded", newNote); 

當SignalR轂被稱爲用戶是服務帳戶,而不是因爲該應用程序的不同層的實際窗口用戶。如果沒有辦法模仿,我相信我可以創造性。

回答

0

基於Connection.Credentials PropertyCredentialCache.DefaultCredentials Property

DefaultCredentials屬性僅適用於NTLM,協商和 基於Kerberos的身份驗證。 DefaultCredentials表示運行 應用程序的當前安全上下文的 系統憑據。對於客戶端應用程序,這些通常是運行該應用程序的用戶的 的Windows憑據(用戶名,密碼和域) 。對於ASP.NET應用程序, 默認憑據是登錄用戶的用戶憑據,或 用戶正在模擬。

假設您使用的是其他形式的身份驗證,則可以基於當前登錄的用戶創建憑據。看看ICredentials Interface

該代碼有點太長,所以只是檢查出來。實現ICredentials接口只包含一個返回NetworkCredential Class的方法。只需使用當前登錄的用戶憑證構建NetworkCredentialClass實例即可。

最後,你有這樣的事情:

var hubConnection = new HubConnection(System.Configuration.ConfigurationManager.AppSettings["fwServiceAddress"].ToString()); 
hubConnection.Credentials = CredentialClass.DefaultCredentials; // returns ICredentials 
IHubProxy customerHub = hubConnection.CreateHubProxy("customer"); 
await hubConnection.Start(); 
await customerHub.Invoke("NewNoteAdded", newNote); 

請通過登錄用戶注意我的意思是登錄在你的MVC應用程序,而不是在客戶端計算機上。如果您需要活動目錄用戶的憑據,則還必須在Web應用程序上實施Windows身份驗證。請參閱How to implement Windows authentication and authorization in ASP.NET

+0

你好。所以在做了大量的研究之後,我發現我確實錯誤地處理了這個問題,而我真正想要的是一個服務總線來處理所有使用signalr的負載均衡服務器之間的經紀業務。但是我現在遇到了問題。自從它將我引向正確的方向之後,我會將其標記爲答案。 –