SignalR具有MVC IIS客户端模拟当前Windows用户

时间:2016-11-03 21:44:49

标签: c# asp.net-mvc-5 signalr iis-8 impersonation

我正在搞乱SignalR,在当前部署的Intranet MVC应用程序中找出很酷的东西来使用它。当前的设置看起来像这样(除了signalr之外已经存在):

架构: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集线器时,由于应用程序的不同层,用户是服务帐户而不是实际的Windows用户。如果没有办法冒充,我相信我可以发挥创意。

1 个答案:

答案 0 :(得分: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应用程序而不是客户端计算机。如果您需要Active Directory用户的凭据,则还必须在Web应用程序上实现Windows身份验证。请参阅How to implement Windows authentication and authorization in ASP.NET