Идентификация с использованием 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?

Извините за длинный пост и заранее спасибо,

0 ответов

Другие вопросы по тегам