SignalR - 在Windows窗体服务器上验证Windows窗体用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SignalR - 在Windows窗体服务器上验证Windows窗体用户相关的知识,希望对你有一定的参考价值。

我有一个小项目,其中包含一个Windows窗体信号器客户端和一个Windows窗体服务器。客户端可以连接到服务器。现在,我想实现一个登录系统。我阅读了一些关于此的博文,文章和问题,但我没有找到办法。我想使用信号器验证系统,所以我可以使用[授权]等属性,因为它已经存在。

要使用它,我需要验证用户名和密码。客户端可以像这样在标头中发送凭据

Connection = new HubConnection(BaseEngine.ServerURI);
Connection.Headers.Add("Username", username);
Connection.Headers.Add("Password", password);
HubProxy = Connection.CreateHubProxy("ChatHub");
await Connection.Start();

并且服务器应该以某种方式在方法中验证这些凭证,如果无效则抛出异常?

我试过使用内置系统,但没有运气。我无法在OnConnected方法中获取Context.User。作为一种解决方法,我尝试在标头中发送用户名和密码并验证它们,但OnConnected方法不能向客户端抛出错误。我确信客户端必须有一个auth cookie,但我真的不知道如何添加它。

谢谢!

答案

以这种方式向服务器发送密码绝不是一个好主意,最好发送服务器可以验证的令牌。

SignalR还有一些认证功能,可以阅读更多有关此here的信息

另一答案

我找到了类似于解决方法的东西:首先,我实现了一个属性,该属性派生自SignalR使用的AuthorizeAttribute。此实现将覆盖在调用使用此属性修饰的方法时调用的AuthorizeHubMethodInvocation方法。因此,在这种方法中,我正在检查请求标头中是否存在授权令牌并验证信息。客户端必须添加此标头才能连接到服务器。这是迄今为止我发现的最简单的方法,但它仍然是一种解决方法。

实施,服务器:

[AttributeUsage(AttributeTargets.Method)]
internal class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override bool AuthorizeHubMethodInvocation(Microsoft.AspNet.SignalR.Hubs.IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
    {
        string token = hubIncomingInvokerContext.Hub.Context.Headers["AuthenticationToken"];

        if (string.IsNullOrEmpty(token))
            return false;
        else
        {
            string decryptedValue = Encryptor.Decrypt(token, Encryptor.Password);

            string[] values = decryptedValue.Split(';');

            string userName = values[0],
                deviceId = values[1];

            bool b = ...check if it's ok...

            return b;
        }
    }
}

实施,客户:

 ComEngine.Connection = new HubConnection(BaseEngine.ServerURI);

 ComEngine.Connection.Headers.Add("AuthenticationToken", Encryptor.Encrypt(string.Format("{0};{1};{2}", BaseEngine.UserName, BaseEngine.DeviceId, BaseEngine.Password), Encryptor.Password));

 try
 {
     await Connection.Start();
 }
 catch (Exception ex)
 {
     ...
 }

以上是关于SignalR - 在Windows窗体服务器上验证Windows窗体用户的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 服务中使用自托管托管 SignalR

使用 Windows Azure 服务总线扩展 SignalR

允许任何用户在没有凭据的情况下使用 cors 访问“signalr/hubs”(服务器运行 Windows 身份验证)

连接到 Windows 服务中自托管的 SignalR 的问题

NancyFx+SignalR 自托管和 Windows 服务

SignalR 自托管 Windows 服务,监听消息