C# SignalR-将未经身份验证的用户映射到自定义id

C# SignalR-将未经身份验证的用户映射到自定义id,c#,asp.net,signalr,C#,Asp.net,Signalr,我想问一个简单的问题,但似乎我找不到答案。这是jist,我想使用Context.ConnectionId以外的唯一值来标识用户 因此,在我的hub类中,我有一个生成唯一guid的方法,这个方法在我通过javascript启动连接时被调用 // My hub class //... public void GenerateGuid() { var guid = Guid.NewGuid().ToString(); Clients.Caller.myGuid(guid); }

我想问一个简单的问题,但似乎我找不到答案。这是jist,我想使用Context.ConnectionId以外的唯一值来标识用户

因此,在我的hub类中,我有一个生成唯一guid的方法,这个方法在我通过javascript启动连接时被调用

// My hub class
//...

public void GenerateGuid()
{
    var guid = Guid.NewGuid().ToString();
    Clients.Caller.myGuid(guid);
}

我还设置了一个IUserIdProvider的自定义实现程序(正如这些文档中建议的那样,使用IPrincipal.Identity.Name以外的东西(由于我的用户没有经过身份验证,所以它无论如何都不会工作))

我认为这需要一些修改,因为我不确定在没有定义guid的情况下返回什么

public class MyUserIdProvider : IUserIdProvider
{
    public string GetUserId(IRequest request)
    {
        try
        {
            if (request.Cookies["guid"] != null)
            {
                return request.Cookies["guid"].Value;
            }
        }
        catch (KeyNotFoundException kex)
        {
            // what to return here?
            return Guid.NewGuid().ToString();
        }
        // what to return here?
        return "";                       
    }
}
。(这是在我的Startup.cs中设置的,因此也不用担心)


那么,考虑到所有这些,我想有两个问题

  • 我是否以正确的方式设置了我的
    MyUserIdProvider
  • 当我想访问Hub类中的用户id时,现在如何访问它?我认为我不能再在这样的调用中使用
    Context.ConnectionId
    返回Groups.Add(Context.ConnectionId,[room])

  • 在调用
    GenerateGuid
    之前,在建立连接时调用
    IUserIdProvider.GetUserId
    。因此,
    cookies
    在该阶段没有用处。您必须根据
    请求设置自己的存储,例如:

    public class MyUserIdProvider : IUserIdProvider
    {
        private static IDictionary<string, Guid> _tokens;
        static MyUserIdProvider()
        {
            _tokens = new ConcurrentDictionary<string, Guid>();
        }
    
        private static string Key(IRequest request)
        {
            var key = request.QueryString["connectionToken"];
            return key;
        }
    
        public static string UserId(IRequest request)
        {
            return _tokens[Key(request)].ToString();
        }
    
        public string GetUserId(IRequest request)
        {
            var key = Key(request);
            _tokens[key] = Guid.NewGuid();
            return _tokens[key].ToString();
        }
    }
    
    GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => new MyUserIdProvider());
    
    public class MyUserIdProvider : IUserIdProvider
    {
        private static IDictionary<string, Guid> _tokens;
        static MyUserIdProvider()
        {
            _tokens = new ConcurrentDictionary<string, Guid>();
        }
    
        private static string Key(IRequest request)
        {
            var key = request.QueryString["connectionToken"];
            return key;
        }
    
        public static string UserId(IRequest request)
        {
            return _tokens[Key(request)].ToString();
        }
    
        public string GetUserId(IRequest request)
        {
            var key = Key(request);
            _tokens[key] = Guid.NewGuid();
            return _tokens[key].ToString();
        }
    }
    
    public void GenerateGuid()
    {
        var guid = MyUserIdProvider.UserId(Context.Request);
        Clients.Caller.myGuid(guid);
    }