Я пишу веб-сайт ASP, использующий безопасность форм и Active Directory.
Я разрешаю пользователю войти в систему с помощью Windows API:
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
Это дает мне указатель токена входа, который я затем сохраняю в переменной сеанса:
bool returnValue = LogonUser(txtUserName.Text, domainName, txtPassword.Text, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref TokenHandle);
if (!returnValue)
{
lblErrorMessage.Text = "Incorrect Username or Password";
lblErrorMessage.Visible = true;
return;
}
Session["TokenHandle"] = TokenHandle;
Теперь, когда меня перенаправляют обратно на мою страницу Default.aspx, я хочу выдать себя за пользователя, который вошел в систему. Таким образом, мне не нужно жестко кодировать имя пользователя строки подключения SQL, я могу просто использовать встроенную защиту. Я делаю это на Загрузка страницы следующим образом:
if (Session["TokenHandle"] != null)
{
IntPtr tokenHandle = new IntPtr(0);
tokenHandle = (IntPtr)Session["TokenHandle"];
WindowsIdentity.Impersonate(tokenHandle);
}
Вот проблема:
Все это прекрасно работает, когда я впервые нажимаю Default.aspx, однако, как только я выполняю обратную передачу, он теряет олицетворение, и я получаю ошибку:
Ошибка входа пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'.
Теперь я знаю, что этот код должен работать, я использовал его в другом проекте. Я просто что-то здесь упускаю.
Также я использую компонент DevExpress.Web.ASPxGridView.v9.2, я не уверен, имеет ли он какое-либо отношение к нему.
Пожалуйста, помогите.