gpt4 book ai didi

c# - SignalR 中心和 Identity.Claims

转载 作者:太空狗 更新时间:2023-10-29 23:29:28 25 4
gpt4 key购买 nike

我正在使用 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 而不是名称,我尝试使用 Identity.Claims。在 Controller 的登录方法中,我创建了新的 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 Controller 和信号器集线器不使用相同的 HttpContext,或者某些东西覆盖了我的声明。我也尝试像这样设置新身份:

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

HttpContext.User = principal;

最佳答案

看看这个-

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

关于c# - SignalR 中心和 Identity.Claims,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36502716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com