0

在 Web API 中,我创建了一个TokenAuthentication属性来验证来自客户端的令牌,之后用户应该登录,然后我使用 myUserServiceManager登录,如下所示:

   ApplicationUser aUser = new ApplicationUser();
                user.CopyToModel(aUser);

                _signInManager.SignIn(aUser, true, true);
                //_signInManager.UserManager.CreateIdentity(authenticationType,"")
                //var l = _authenticationManager.GetExternalLoginInfo();
                ////l.Login.
                //var authType = _authenticationManager.GetAuthenticationTypes();
                //var  cliamIdentity = _authenticationManager.CreateTwoFactorRememberBrowserIdentity(aUser.Id);

                var claims = new List<Claim>();
                claims.Add(new Claim(ClaimTypes.Name, user.UserName));
                claims.Add(new Claim(ClaimTypes.Email, user.Email));
                claims.Add(new Claim(ClaimTypes.NameIdentifier, user.UserName));

                var identity = new ClaimsIdentity(claims, "CustomApiKeyAuth");

                var principal = new ClaimsPrincipal(new[] { identity });
                Thread.CurrentPrincipal = principal;
                System.Web.HttpContext.Current.User = principal;

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

                return UpdateResult<SignInStatus>.Success(SignInStatus.Success);

由于 web api 中的线程不同,我同时使用Thread.CurrentPrincipal并设置了 Principal。System.Web.HttpContext.Current.User

我的目的是Thread.CurrentPrincipal.Identity.Name可以在我的 api 控制器中使用。TokenAuthentication然后我在登录后将其设置在我的属性中:

Thread.CurrentPrincipal = System.Web.HttpContext.Current.User;

它不起作用,并且 Thread.CurrentPrincipal.Identity.Name 在 api 控制器中仍然是空的。我在我的操作中移动了上面的行并且工作了,但我不想在我的每个操作中都写它。我应该怎么办?

4

1 回答 1

0

实际上我决定创建一个继承自 AuthorizeAttribute 的属性来解决问题,而不是在每个操作中重复分配。但是在阅读了AuthorizeAttribute 源之后,我找到了另一个解决方案:

 actionContext.ControllerContext.RequestContext.Principal = System.Web.HttpContext.Current.User;

它是在自定义tokenAuthentication属性中编写的,而不是Thread.CurrentPrincipal = System.Web.HttpContext.Current.User它的工作。现在 api 控制器中的 Thread.CurrentPrincipal 具有正确的主体。

于 2017-02-08T05:35:50.123 回答