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

Posted

技术标签:

【中文标题】SignalR 具有 MVC IIS 客户端模拟当前 Windows 用户【英文标题】:SignalR have MVC IIS client Impersonate Current Windows User 【发布时间】:2016-11-03 21:44:48 【问题描述】:

我正在搞乱 SignalR,想办法在当前部署的 Intranet MVC 应用程序中使用它。当前设置如下所示(除了信号器之外已经存在):

架构: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】:

基于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 = CredentialCache.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。

【讨论】:

您好。因此,经过大量研究后,我发现我确实错误地解决了这个问题,而我真正想要的是一个服务总线来处理我所有使用信号器的负载平衡服务器之间的代理。但是我现在遇到了问题。我会将其标记为答案,因为它引导我朝着正确的方向前进。

以上是关于SignalR 具有 MVC IIS 客户端模拟当前 Windows 用户的主要内容,如果未能解决你的问题,请参考以下文章

在本地 IIS 下运行是不是会限制 Signalr 连接的数量

SignalR系列教程:在MVC在使用SignalR

SignalR,有限的唯一连接(打开的选项卡)IIS 8,Windows 8

具有自托管的 SignalR 客户端服务器应用程序

.net core 3.0 Signalr - 08 业务实现-客户端demo

.net core 3.0 Signalr - 08 业务实现-客户端demo