C# 信号器-使用用户ID提供程序向用户发送消息

C# 信号器-使用用户ID提供程序向用户发送消息,c#,javascript,asp.net,asp.net-mvc,signalr,C#,Javascript,Asp.net,Asp.net Mvc,Signalr,使用SignalR,我相信我应该能够通过使用 有没有人举过一个如何实施的例子?我找了又找,找不到任何例子。我需要以javascript客户端为目标 用例是,我的站点的用户将拥有一个帐户。它们可以从多个设备/浏览器登录。当某些事件发生时,我会向他们发送一条消息。我没有研究过SignalR 2.0,但我认为这是以前版本的SignalR的扩展。连接到集线器时,可以使用Authorize属性对其进行修饰 [HubName("myhub")] [Authorize] public class MyHub1

使用SignalR,我相信我应该能够通过使用

有没有人举过一个如何实施的例子?我找了又找,找不到任何例子。我需要以javascript客户端为目标


用例是,我的站点的用户将拥有一个帐户。它们可以从多个设备/浏览器登录。当某些事件发生时,我会向他们发送一条消息。

我没有研究过SignalR 2.0,但我认为这是以前版本的SignalR的扩展。连接到集线器时,可以使用Authorize属性对其进行修饰

[HubName("myhub")]
[Authorize]
public class MyHub1 : Hub
{
    public override System.Threading.Tasks.Task OnConnected()
    {
        var identity = Thread.CurrentPrincipal.Identity;
        var request = Context.Request;
        Clients.Client(Context.ConnectionId).sayhello("Hello " + identity.Name);
        return base.OnConnected();
    }
}

如您所见,您可以访问访问集线器的用户的身份。我相信新的能力只不过是它的延伸。由于客户端和集线器之间的连接始终保持活动状态,因此您将始终拥有主体身份,这将为您提供用户ID。

我相信这可以帮助您:(链接自)

由userId标识的特定用户

Clients.User(userid).addContosoChatMessageToPage(name, message);
用户ID可以使用IUserId接口确定:

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}
IUserIdProvider
的默认实现是
PrincipalUserIdProvider
。要使用此默认实现,请在应用程序启动时首先在
GlobalHost
中注册它:

var idProvider = new PrincipalUserIdProvider();
GlobalHost.DependencyResolver.Register (typeof(IUserIdProvider), () => idProvider);

然后,可以通过从客户端传入请求对象来确定用户名。

那么您在什么地方跟踪
Context.user.Identity
Context.ConnectionId
?您的用例与您提供的链接中的示例有何不同?不,我没有太多。只是一个简单的集线器和连接到它的javascript。然后我建议仔细看看您链接的示例。他们使用一个集合来维护用户名和连接,这允许他们在特定连接上调用客户端方法。。。也许我误解了他们的文档。在您可以手动将用户ID同步到连接ID并适当广播之前。我认为用户ID提供程序的目的是消除这种手动跟踪。我想它会根据正常身份验证使用的同一个用户知道用户是谁。关键是,如果你有用户名,你不必跟踪任何东西。默认情况下,当从javascript客户端连接时,Thread.CurrentPrincipal.Identity和Context.Request都为空,在调试我的应用程序时,它将使用用户名(如果您使用某种形式的身份验证来设置主体)。是否有一种特殊的方式从javascript连接,以便它知道它需要这些信息?那么,您是如何登录到您的应用程序的?你有做认证的东西吗?我一直在读这个。对于我的MVC和webapi,我有一个HttpModule,它执行基本的身份验证并从那里设置主体。这对于MVC中的API和视图来说非常有效。然而,我读到,对于信号器连接,我认为这些授权头不会被发送。因此,这可能是我面临的根本问题。您的中心没有理由不能使用它。是否已添加GlobalHost.HubPipeline.RequireAuthentication();到您的global.asax或您已注册中心的任何位置?尚未尝试,但将尝试。但是,我应该不需要“要求”它,对吗?我应该能够拥有授权用户和匿名用户?只需尝试。不行。不过谢谢。正如dfowler所说,不需要这样做:“要使用此默认实现,请在应用程序启动时首先在GlobalHost中注册它:”作为默认值。