C# SignalR-将未经身份验证的用户映射到自定义id
我想问一个简单的问题,但似乎我找不到答案。这是jist,我想使用Context.ConnectionId以外的唯一值来标识用户 因此,在我的hub类中,我有一个生成唯一guid的方法,这个方法在我通过javascript启动连接时被调用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); }
// 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
类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);
}