2016-11-16 81 views
0

我想問一個簡單的問題,它似乎是我找不到答案的。這裏的JIST,我想用比其他Context.ConnectionId的唯一值,用於識別用戶SignalR - 將未經認證的用戶映射到自定義ID

所以,在我的HUB類我有這樣的方法來生成一個唯一的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以外的東西(因爲我的不對用戶進行認證這無論如何都不會工作)的定製實施者)

我認爲這需要一點點修改,因爲我不能確定如何在一個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所以不用擔心要麼)

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

所以,有了這一切,我想有兩個問題

  1. 我是不是設置了我MyUserIdProvider類以正確的方式嗎?
  2. 當我想要在我的Hub類中訪問用戶的ID時,我該如何訪問它?我不認爲我可以在調用像這樣使用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); 
} 
相關問題