2009-03-12 4 views
5

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

Как мне лучше всего это сделать, используя WindowsAuthentication?

ответ

3

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

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

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

Марк

+0

Создание производного класса была моя идея, но я не уверен, если он разумно заменить IPrincipal и как это сделано правильно. Я намерен найти адрес электронной почты из каталога, но моя идея состояла в том, чтобы собрать всю информацию о пользователе в одном месте, точно так же, как я сделал w. пользовательская аутентификация. – PHeiberg

+0

Я не вижу никаких проблем с заменой WindowsPrincipal на ваш собственный ExtendedWindowsPrincipal, если это производный класс. В конце концов, это все еще WindowsPrincipal - с некоторыми добавленными вещами. Чтобы сделать это, я бы исследовал global.asax и Application_AuthenticateRequest. –

+0

У меня возникли проблемы с попыткой заставить IsInRole работать и не хотелось тратить время на использование IPrincipal, поэтому я оставил остальную информацию пользователя в контекстных элементах. Спасибо за помощь. – PHeiberg

3

Я в конечном итоге рефакторинга мое первоначальное решение в замене Principal вместо идентичности, как я думал. Замена Identity оказалась затруднительной, так как я столкнулся с проблемами безопасности при создании экземпляра нового расширенного 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); 
+0

спасибо за сообщение, ударил головой в течение нескольких часов. Иди в те же проблемы безопасности ... wtf! правильно? Ваше решение работает, хотя большое спасибо! –

Смежные вопросы