SignalR hub和Identity.Claims

时间:2016-04-08 14:51:13

标签: c# asp.net asp.net-mvc signalr signalr-hub

我使用SignalR从服务器(Asp.net MVC)向客户端发送通知,在我的OnConnected()方法中,我使用登录名(电子邮件)注册用户:

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

现在我想使用accountId而不是name,我尝试使用Identity.Claims。在我在控制器中的Login方法中,我创建了新的ClaimsIdentity

[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;
}
}

我无法使用此功能在Hub中的OnConnected方法中访问我的ClaimsIdentity:

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

并使用类似的方式。我尝试了很多不同的方法,但我总是感觉到mvc控制器和信号器集线器没有使用相同的HttpContext,或者有些东西覆盖了我的主张。我也尝试设置这样的新身份:

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

HttpContext.User = principal;

2 个答案:

答案 0 :(得分:2)

看看这个 -

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

答案 1 :(得分:0)

我有同样的问题。确保在启动类中的SignalR之前先调用Authentication。

        app.UseAuthentication();

        app.UseSignalR(routes =>
        {
            routes.MapHub<MainHub>("/hubs/main");
        });