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 Azure 服务总线扩展 SignalR
允许任何用户在没有凭据的情况下使用 cors 访问“signalr/hubs”(服务器运行 Windows 身份验证)
连接到 Windows 服务中自托管的 SignalR 的问题