我正在搞乱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用户。如果没有办法冒充,我相信我可以发挥创意。
答案 0 :(得分:0)
基于Connection.Credentials Property和CredentialCache.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。