Подтвердить что ты не робот

Thread.CurrentPrincipal.Identity в ASP.NET - безопасно использовать

Внутри обработчика событий AuthenticateRequest я устанавливаю Thread main. Вот часть моего IHttpModule:

    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += AuthenticateRequest;
    }

    private void AuthenticateRequest(object sender, EventArgs e)
    {
        var principal = CreatePrincipal();
        HttpContext.Current.User = principal;
    }

Но у меня есть сборка, которая не должна иметь доступ к System.Web, поэтому я не могу использовать HttpContext.Current.User, но мне нужно получить доступ к текущему главному. Моя первая мысль заключалась в том, чтобы изменить мой метод на:

System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User = principal;

и при необходимости используйте Thread.CurrentPrincipal.

Но насколько я помню, небезопасно хранить определенные запросы в Thread Local Storage, поскольку несколько потоков могут обрабатывать один и тот же запрос, поэтому я думаю, что это то же самое с Thread.CurrentPrincipal. Или нет?

4b9b3361

Ответ 1

Я не согласен с ответом Джеффа Мозера.

Стандартный материал авторизации .NET работает с использованием Thread.CurrentPrincipal. например:.

PrincipalPermissionAttribute
PrincipalPermission.Demand

Кроме того, если вы настроите .NET RoleProvider, он установит Thread.CurrentPrincipal в ту же самую главную директорию, что и HttpContext.User.

Поэтому это стандартный способ сделать это, и я бы сделал то же самое в вашем пользовательском коде проверки подлинности (или даже лучше - реализовать его как пользовательский RoleProvider).

Что касается асинхронного ввода-вывода, этот пост в блоге, то указано, что Thread.CurrentPrincipal и настройки культуры автоматически передаются в новый поток.

Использование Thread.CurrentPrincipal, возможно, более безопасно, если ваша библиотека использует принципал для целей авторизации, поскольку ненадежный код может передаваться в качестве аргумента в качестве аргумента, тогда как CAS может помешать ему установить Thread.CurrentPrincipal.