2016-11-16 2 views
0

Я хотел задать простой вопрос, и, похоже, я не могу найти ответ. Вот тэк, я хочу использовать уникальное значение, отличное Context.ConnectionId для идентификации пользователейSignalR - сопоставление неаутентифицированных пользователей с пользовательским идентификатором

Так, на моем классе хаб у меня есть этот метод, чтобы генерировать уникальный идентификатор GUID, этот метод вызывается, когда я начинаю соединение через мой javascript

// My hub class 
//... 

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

.

// My javascript 
$.connection.hub.start().done(function(){ 
    $.connection.chatHub.server.generateGuid(); 
}); 

$.connection.chatHub.client.myGuid = function (guid){ 
    if (docCookies.getItem("guid") === null){ 
     docCookies.setItem("guid", guid); 
    } 
} 

Я также настроить пользовательский реализатор IUserIdProvider (как это было предложено в этих Документах https://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#IUserIdProvider использовать что-то другое, чем IPrincipal.Identity.Name (который не будет работать в любом случае, потому что мои пользователи не авторизованы))

Я думаю, что это нужно немного модифицировать, так как я не уверен, что вернуть в том случае, когда справы не определен

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 так не стоит беспокоиться ни)

GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new MyUserIdProvider()); 

So, со всем этим я полагаю, есть два вопроса

  1. Могу ли я что установил MyUserIdProvider класс в правильном направлении?
  2. Когда я хочу получить доступ к идентификатору пользователя в классе Hub, как мне получить к нему доступ сейчас? Я не думаю, что я могу использовать Context.ConnectionId больше в вызовах, такие как это: return Groups.Add(Context.ConnectionId, [room]);

ответ

0

IUserIdProvider.GetUserId призываются соединения, установленных до GenerateGuid называется. Таким образом, cookies не используется на этой фазе. Вы должны настроить свое собственное хранение на основе request, например:

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(); 
    } 
} 

С этим хранилищем, вы можете получить свой идентификатор пользователя из request в методе хаба:

public void GenerateGuid() 
{ 
    var guid = MyUserIdProvider.UserId(Context.Request); 
    Clients.Caller.myGuid(guid); 
}