我将在底部保留旧版本的问题。
我想为SignalR客户端实现自定义身份验证。在我的情况下,这是Java客户端(Android)。不是Web浏览器。没有表单身份验证,也没有Windows身份验证。这些都是使用Java库的纯香草HTTP客户端。
因此,假设客户端连接到HUB时传递了自定义标头。我需要根据此标头对用户进行身份验证。文档这里提到这是可能的,但没有给出任何有关如何实现的详细信息。
这是我从Android端的代码:
hubConnection = new HubConnection("http://192.168.1.116/dbg", "", true, new NullLogger());
hubConnection.getHeaders().put("SRUserId", userId);
hubConnection.getHeaders().put("Authorization", userId);
final HubProxy hubProxy = hubConnection.createHubProxy("SignalRHub");
hubProxy.subscribe(this);
// Work with long polling connections only. Don't deal with server sockets and we
// don't have WebSockets installed
SignalRFuture<Void> awaitConnection = hubConnection.start(new LongPollingTransport(new NullLogger()));
try
{
awaitConnection.get();
Log.d(LOG_TAG, "------ CONNECTED to SignalR -- " + hubConnection.getConnectionId());
}
catch (Exception e)
{
LogData.e(LOG_TAG, e, LogData.Priority.High);
}
附言:以下原始问题是我希望“简化”事情的愿望。因为我可以在OnConnected
回调中访问标头。我认为有一种简单的方法可以在那里立即断开连接。
使用自定义身份验证机制的Signal R。我只需检查连接请求中是否传递了某些标头,以确定连接客户端。
问题是 - 如何拒绝或不连接未通过我的检查的用户?文档此处并没有真正解释这种情况。提到了使用证书/标头 - 但没有关于如何在服务器上处理它的示例。我不使用表单或Windows身份验证。我的用户-Android Java设备。
这是我想要拒绝连接的Hub中的代码..
public class SignalRHub : Hub
{
private const string UserIdHeader = "SRUserId";
private readonly static SignalRInMemoryUserMapping Connections = new SignalRInMemoryUserMapping();
public override Task OnConnected()
{
if (string.IsNullOrEmpty(Context.Headers[UserIdHeader]))
{
// TODO: Somehow make sure SignalR DOES NOT connect this user!
return Task.FromResult(0);
}
Connections.Add(Context.Headers[UserIdHeader], Context.ConnectionId);
Debug.WriteLine("Client {0}-{1} - {2}", Context.Headers[UserIdHeader], Context.ConnectionId, "CONNECTED");
return base.OnConnected();
}