Является ли Thread.CurrentPrincipal надежным с использованием аутентификации OWIN и веб-API?

До MVC5 я слышал о / был в состоянии воспроизвести проблему в прошлом, когда Thread.CurrentPrincipal не всегда устанавливается правильно при использовании асинхронных операций. Вот одно сообщение в блоге, в котором обсуждается эта проблема: http://www.hanselman.com/blog/SystemThreadingThreadCurrentPrincipalVsSystemWebHttpContextCurrentUserOrWhyFormsAuthenticationCanBeSubtle.aspx

Теперь я настроил аутентификацию в новом проекте Web API с использованием промежуточного программного обеспечения OWIN в.NET 4.5.2 (с использованием провайдера аутентификации токена). Контроллеры Web API состоят в основном из асинхронных операций, которые вызывают другую сборку бизнес-уровня. Я хотел бы использовать атрибуты ClaimsPrincipalPermission для безопасного вызова методов этой сборки. Этот атрибут работает с ClaimsAuthorizationManager, который проверяет доступ. Я предполагаю, что под покровом это использует Thread.CurrentPrincipal, и поэтому я скептически отношусь к тому, собираюсь ли я столкнуться с той же проблемой, когда Thread.CurrentPrincipal не совпадает с проблемой исходной программы, вызывающей веб-API.

Могу ли я испытать эту же проблему? Пока я не воспроизвел его, но я не уверен, что проблема действительно решена. Я думаю, что более вероятно, что я просто еще не смог воспроизвести проблему, которая все еще существует.

Рекомендации:

https://msdn.microsoft.com/en-us/library/system.identitymodel.services.claimsprincipalpermissionattribute(v=vs.110).aspx

http://dotnetcodr.com/2013/02/21/introduction-to-claims-based-security-in-net4-5-with-c-part-4-authorisation-with-claims/

1 ответ

Не уверен, что вы когда-нибудь решали это, но я столкнулся с этой самой проблемой в конце довольно крупного проекта.

Единственная причина, по которой я обнаружил, что это происходило, была из-за ошибки кодирования, которая была у меня на внешнем интерфейсе, из-за которой асинхронный ajax-вызов моего API был отправлен дважды.

Частью процесса обработки вызова было добавление претензий к моему owinContext самоконтролю. Я бы предположил, что вызовы будут потокобезопасными (или для каждого запроса), но я обнаружил, что принцип утверждений во втором вызове содержал утверждения из первого вызова. Мое решение было этим.

При настройке утверждений, извлекайте ClausPrint из RequestContext.Principal.Identity НЕ owinContext.

Затем вы можете прочитать требования позже на вашем бизнес-уровне, или что у вас есть, из owinContext.

Я не понимаю, почему, может быть, кто-то может уточнить, но, похоже, это решило проблему.

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