0

В веб-API я создал атрибут TokenAuthentication для проверки токена, который пришел от клиента, после чего пользователь должен войти в систему, а затем я использую свой UserServiceManager для входа в систему, например это:Разное Thread.Principal в веб-атрибуте Api

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); 

I Используется как Thread.CurrentPrincipal и System.Web.HttpContext.Current.User установить Principal из-за другой поток в Web API.

Моя цель Thread.CurrentPrincipal.Identity.Name может использоваться в моем контроллере api. Затем я установить это в TokenAuthentication моего Attribute после входа:

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

он не работает и Thread.CurrentPrincipal.Identity.Name еще пуст в апи controller.I переехал выше линии в моем действии и работал, но я не хочу напишите это в каждом из моих действий. что мне делать?

+0

Если вы находитесь в действии, вы можете получить из свойства 'User', ex:' this.User' из 'ApiController' –

+0

Спасибо, но у меня есть несколько служб, которые используют Thread.CurrentPrincipal.Identity.Name и i необходимо использовать это. Я должен назначить this.User Thread.CurrentPrincipal в моем действии тоже. как я сказал, я не хочу такого задания в каждом из моих действий. Мне нужно что-то в целом. –

ответ

0

На самом деле я решил создать атрибут, унаследованный от AuthorizeAttribute, для решения проблемы и не повторять назначение в каждом действии. но после прочтения AuthorizeAttribute source я нашел другое решение:

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

Это было написано в атрибуте вместо Thread.CurrentPrincipal = System.Web.HttpContext.Current.User пользовательских tokenAuthentication, и она работала. Теперь Thread.CurrentPrincipal в контроллере api имеет правильный принцип.