在最新版本的Asp.Net SignalR中,添加了一种使用"IUserIdProvider"接口向特定用户发送消息的新方法.
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何知道我向谁发送信息?这种新方法的解释非常肤浅.SignalR 2.0.0的声明草案带有这个bug并且没有编译.有没有人实现过这个功能?
更多信息:http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
拥抱.
我将旧版本的问题留在底部.
我想为SignalR客户端实现自定义身份验证.在我的例子中,这是Java客户端(Android).不是网络浏览器.没有表单身份验证,没有Windows身份验证.这些是使用java库的普通vanilla客户端.
所以,假设连接到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);
}
Run Code Online (Sandbox Code Playgroud)
PS下面的原始问题是我"简化"问题的愿望.因为我可以在OnConnected回调中访问标题.我认为有简单的方法可以放下连接...
使用Signal R和自定义身份验证机制.我只是检查连接客户端是否有连接请求传入的某些标头.
问题是 - 如何拒绝或不连接未通过支票的用户?这里的文档并没有真正解释这种情况.提到使用证书/标题 …