Пользовательский IPrincipal вместе с WindowsAuthentication

Есть ли хороший способ объединить проверку подлинности Windows ASP.NET с настраиваемым объектом IPrincipal / IIdentity? Мне нужно сохранить адрес электронной почты пользователя, и я сделал это для проверки подлинности с помощью форм с использованием настраиваемой пары IIdentity / IPrincipal, которую я добавил в Context.CurrentUser во время события AuthenticateRequest.

Как мне лучше всего сделать это с помощью WindowsAuthentication?


person PHeiberg    schedule 12.03.2009    source источник


Ответы (2)


Может быть, вы могли бы создать свой «ExtendedWindowsPrincipal» как производный класс на основе WindowsPrincipal и просто добавить свои дополнительные данные в производный класс?

Таким образом, ваш ExtendedWindowsPrincipal будет по-прежнему распознаваться везде, где требуется WindowsPricinpal.

ИЛИ: поскольку вы говорите об использовании проверки подлинности Windows, вы, вероятно, находитесь в сети Windows - есть ли где-нибудь Active Directory или база данных пользователей, где вы могли бы найти свой адрес электронной почты, который вас интересует, а не хранить его в главном?

Марк

person marc_s    schedule 12.03.2009
comment
Создание производного класса было моей идеей, но я не уверен, разумно ли заменить IPrincipal и как это сделать правильно. Я намеревался найти адрес электронной почты в каталоге, но моя идея заключалась в том, чтобы собрать всю информацию о пользователях в одном месте, как я это сделал с w. настраиваемая аутентификация. - person PHeiberg; 13.03.2009
comment
Я не вижу проблем с заменой WindowsPrincipal вашим собственным ExtendedWindowsPrincipal, если это производный класс. В конце концов, это все еще WindowsPrincipal - с некоторыми добавками. Для этого я бы исследовал global.asax и Application_AuthenticateRequest. - person marc_s; 13.03.2009
comment
У меня возникли проблемы с попыткой заставить IsInRole по-прежнему работать, и я не хотел тратить время на использование IPrincipal, поэтому в итоге я поместил остальную информацию о пользователе в элементы контекста. Спасибо за помощь. - person PHeiberg; 15.03.2009

Я закончил рефакторинг своего первоначального решения, заменив Принципала вместо Идентичности, как я первоначально думал. Замена удостоверения оказалась сложной задачей, поскольку я столкнулся с проблемами безопасности при создании экземпляра нового расширенного WindowsPrincipal.

public class ExtendedWindowsPrincipal : WindowsPrincipal
{
    private readonly string _email;

    public ExtendedWindowsPrincipal(WindowsIdentity ntIdentity, 
       string email) : base(ntIdentity)
    {
            _email = email;
    }

    public string Email
    {
        get { return _email; }
    }
}

В моем модуле аутентификации я заменил принципала в HttpContext следующим образом:

var currentUser = (WindowsIdentity)HttpContext.Current.User.Identity;
HttpContext.Current.User = 
    new ExtendedWindowsPrincipal(currentUser, userEmail);
person PHeiberg    schedule 27.03.2009
comment
спасибо за пост, уже несколько часов бью головой. Наткнулся на те же проблемы с безопасностью ... черт возьми! правильно? Ваше решение работает, большое спасибо! - person B Z; 29.12.2010