【问题标题】:SignalR - How and where to use the handle obtained through the interface IUserIdProviderSignalR - 如何以及在何处使用通过接口 IUserIdProvider 获得的句柄
【发布时间】:2014-05-05 23:13:36
【问题描述】:

我在几个地方(包括 Microsoft SignalR 官方网站)查看了示例,但不明白这是如何工作的。

我在课堂上实现了这个以获得不同的 id:(我没有使用IPrincipal.Identity.Name

public class CustomUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        //for example
        return Guid.NewGuid().ToString();
    }
}

但我不明白如何或在哪里可以获得新生成的 id?有人可以给我看看吗?或者让我了解这一切是如何运作的!

提前谢谢你。

**更新**

现在我知道这是如何工作的了。其实我很困惑……我都很困惑。 Client.ClientsClients.User。所以没有得到预期的结果,我在User中使用了ConncetionIdClients.User(Context.ConnectionId),与此无关。

对不起。

【问题讨论】:

    标签: asp.net signalr real-time signalr-hub


    【解决方案1】:

    无法检索新生成的 id。由于您在 Hub 方法和 PersistentConnection.OnReceived 内部有一个可用的 IRequest 对象,因此您应该能够从 Hub 方法中的 IRequest 派生调用者的 UserId,就像您在自定义 GetUserId 方法中所做的那样。

    您的示例实现不会有用,因为您不会为同一调用者发出的每个请求返回相同的 id。您可能拥有的一种选择是通过从 you can customize 的查询字符串中提取他们的用户 ID 来识别您的用户。但是,如果您不希望欺骗 UserId,则必须小心如何执行此操作。

    一旦您有办法从来自同一调用者的所有 IRequest 中提取相同的 UserId,您应该能够执行以下操作:

    public class CustomUserIdProvider : IUserIdProvider
    {
        public string GetUserId(IRequest request)
        {
            //for example
            return MyStatic.ExtractUserId(request);
        }
    }
    
    public class MyHub : Hub
    {
        public string GetMyUserId()
        {
            return MyStatic.ExtractUserId(Context.Request);
        }
    
        public void SendToUser(string userId, string message)
        {
            Clients.User(userId).send(message);
        }
    }
    

    【讨论】:

    • 哈特哈特!谢谢你的回复。但是这种生成ID的方式只是一个例子!在这种情况下,您提到了伪造连接……有更安全的方法来执行此过程吗?请记住,我不使用 Microsoft 或 Owin Auth。您可以执行您的回复,说明我在哪里调用该方法:GetMyUserId()?为什么我需要一个 CustomUserIdProvider 类?我不明白它的真正含义。非常感谢。
    • myStatic 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多