2014-10-21 3 views
0

У меня есть веб-приложение mvc4, в котором пользователи регистрируются в своих учетных записях в своем роуминге. Я аутентифицирую их через Active Directory. И почти во всех методах мне нужно олицетворять зарегистрированного пользователя, чтобы сделать некоторые операции с файлами.Могу ли я выдавать себя за сеанс?

Я использую следующие методы для олицетворения:

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern int LogonUser (string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken); 

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern int ImpersonateLoggedOnUser (IntPtr hToken); 

[DllImport("advapi32.dll", SetLastError = true)] 
static extern int RevertToSelf(); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern int CloseHandle (IntPtr hObject); 

private IntPtr lnToken; 

Я выполнил свою impersonater как IDisposable класса и в constructor я олицетворять и в Dispose методы я вернуться обратно к пользователю, который был на перед моим олицетворением. Так что я могу использовать его в using заявление легко в моих методах контроллера, как это:

public ActionResult SomeAction (string param) 
{ 
    using (new Impersonator(username, password, nameSpace)) 
    { 
     /// do staff 
    } 
} 

Этот подход работает просто отлично, хотя я полагал, что это замедляет время отклика веб-сайта в течение 1,5-2 секунд и I это немного раздражает.

Что мне интересно? Могу ли я сделать олицетворение, когда пользователь входит в систему и возвращается назад, когда выходит из системы или время их сеанса? Другими словами, могу ли я сохранить олицетворение живым через сеанс?

Возможно, я не использую правильную терминологию, извините.

+0

Можете ли вы позволить IIS (при условии, что вы используете его) обрабатывать аутентификацию? Мы делаем это с нашим приложением, а затем IIS также обрабатывает олицетворение для вас - весь запрос затем выполняется в контексте пользователя. –

+0

Да Я запускаю свой сайт под IIS. Но возможно ли, чтобы IIS выдавал себя за разные логины? Или вы говорите об идентификаторе пула приложений в IIS? –

+0

Да, каждый пользователь будет выдавать себя индивидуально. В этот момент все работает в контексте безопасности, а не в пуле приложений. –

ответ

1

Если вы в состоянии, я бы рекомендовал использовать IIS для выполнения как аутентификации, так и олицетворения для вас в этом сценарии. Если вы:

  • Включить ASP.NET Impersonisation
  • Отключить анонимной проверки подлинности
  • Enable Basic Authentication (если у вас есть клиенты из-за пределов области)
  • Включить Windows Authentication (если у вас есть клиенты в домене)

Когда люди запрашивают страницу с сайта, IIS выдаст браузеру HTTP 401 Challenge. Если он находится в том же домене, и браузер поддерживает его (IE и Chrome автоматически), текущий пользователь автоматически войдет на сайт. Если они находятся за пределами домена, браузер представит окно входа для проверки подлинности.

Обратите внимание, что если вы используете Basic Auth, учетные данные отправляются в виде обычного текста, поэтому важно иметь надлежащим образом защищенное https-соединение.

После аутентификации с помощью IIS, только тогда запрос поступит в .Net - в этот момент он будет работать в контексте безопасности пользователя, а не в пуле приложений. Обратите внимание, что звонок:

System.Security.Principal.WindowsIdentity.GetCurrent().Name 

покажет олицетворенного пользователя.