Идентификация с использованием Thread.CurrentPrincipal против HttpContext.Current.User
Я знаю, что в этой теме могут быть повторяющиеся вопросы, но я все еще не понимаю. У меня очень странный случай с Thread.CurrentPrincipal.Identity и HttpContext.Current.User.Identity.
У меня есть класс userIdentity.cs, где я полагаюсь на получение текущего активного пользователя с моего токена. Первоначально мое приложение представляет собой приложение MVC, размещенное в IIS на двух отдельных виртуальных машинах. Я использовал Thread.CurrentPrincipal.Identity для извлечения текущего пользователя из утверждений токена, и у меня не возникло никаких проблем. Однако я обновил код, чтобы он был совместим с приложением SPA, встроенным в react. После обновления Thread.CurrentPrincipal.Identity больше не работает, поэтому мне пришлось выполнить резервный план и вызвать HttpContext.Current.User.Identity, чтобы повторно подтвердить претензии. Итак, пользовательский класс Identity обновлен следующим образом:
public class UserIdentity : IUserIdentity
{
private IIdentity _identity;
public UserIdentity()
{
_identity = null;
_identity = InitializeClaimsIdentity();
}
private ClaimsIdentity InitializeClaimsIdentity()
{
return Thread.CurrentPrincipal?.Identity != null ?
Thread.CurrentPrincipal.Identity as ClaimsIdentity :
HttpContext.Current.User.Identity as ClaimsIdentity; //HttpContext.Current.User.Identity used for Main SPA
}
public string GetUserId()
{
var userId = GetClaimsIdentity().FindFirst("username")?.Value;
userId = string.IsNullOrEmpty(userId) ? GetClaimsIdentity(forceInit: true).FindFirst("username")?.Value : userId;
return userId;
}
public ClaimsIdentity GetClaimsIdentity(bool forceInit = false)
{
if (_identity == null || forceInit)
{
_identity = InitializeClaimsIdentity();
}
return (ClaimsIdentity)_identity;
}
}
Это решение отлично работает в среде разработки (на MVC и SPA).
Однако после развертывания этого решения в производственной среде MVC размещался на 2 виртуальных машинах, и при значительном количестве пользователей одновременно претензии начали возвращаться неверным способом. Неправильные идентификаторы пользователей, возвращающие неверные данные. При его отладке воспроизвести случай не удалось. При удалении HttpContext.Current.User.Identity как ClaimsIdentity в качестве резервного решения все работает как шарм;
Если бы кто-нибудь мог объяснить мне основное различие между Thread.CurrentPrincipal и Current.User, было бы здорово.
Плюс, как правильно реализовать решение, совместимое с приложением MVC и реагировать на SPA?
Извините за длинный пост и заранее спасибо,