2016-04-08 6 views
2

ich SignalR bin mit für Benachrichtigungen von Server (Asp.net MVC) an den Client zu senden, und in meinem OnConnected() Methode habe ich Benutzer mit Login-Namen registrieren (E-Mail):SignalR Nabe und Identity.Claims

public override Task OnConnected() 
{ 
string userName = Context.User.Identity.Name; 
string connectionId = Context.ConnectionId; 
Groups.Add(connectionId, userName); 
return base.OnConnected(); 
} 

Jetzt möchte ich AccountId anstelle von Namen verwenden, und ich versuche das mit Identity.Claims. In meiner Login-Methode in Controller habe ich neuen ClaimsIdentity

erstellt
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult Login(LoginViewModel model) 
{ 
---- 

var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.Email), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role); 

identity.AddClaim(new Claim(ClaimTypes.Role, "guest")); 
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person")); 
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, validation.AccountId.ToString())); //from db 

AuthenticationManager.SignIn(new AuthenticationProperties 
{ IsPersistent = true}, identity); 

AuthenticationManager.SignIn(identity); 

----- 
} 

private IAuthenticationManager AuthenticationManager 
{ 
get 
{ 
return HttpContext.GetOwinContext().Authentication; 
} 
} 

Ich kann meinen ClaimsIdentity in meiner OnConnected Methode in Hub nicht zugreifen kann, mit dieser:

var claim = ((ClaimsIdentity)Context.User.Identity).FindFirst(ClaimTypes.NameIdentifier); 

und unter Verwendung ähnliche Weise. Ich versuche viele verschiedene Möglichkeiten, aber ich habe immer zu fällen, dass MVC-Controller und Signal-Hub nicht verwenden Sie den gleichen HttpContext, oder etwas überschreiben meine Ansprüche. Ich versuche auch, neue Identität wie folgt festgelegt:

IPrincipal principal = 
new GenericPrincipal(new GenericIdentity("myuser"), new string[] { "myrole" }); 
    Thread.CurrentPrincipal = principal; 

oder

HttpContext.User = principal; 
+0

Haben Sie versucht, immer den Anspruch von 'HttpContext.Current.User.Identity 'anstelle des' HubCallerContext' welcher SignalR verfügbar macht? – peco

Antwort

1

Check out this-

var identity = (ClaimsIdentity)Context.User.Identity; 
var tmp= identity.FindFirst(ClaimTypes.NameIdentifier);