Выдача себя за пользователей через NTLM - PullRequest
8 голосов
/ 06 августа 2009

У меня есть внутреннее приложение с двумя уровнями безопасности. Проверка подлинности Forms для клиентского приложения и встроенная проверка подлинности NTLM для интерфейса управления.

Я могу легко выдать себя за клиента, просто создав надлежащий файл cookie .ASPXAUTH с помощью методов класса FormsAuthentication. Однако создание заголовка HTTP-аутентификации для NTLM пока мне не подходит.

Когда я нашел эту статью, у меня были надежды (http://msdn.microsoft.com/en-us/library/ms998358.aspx#paght000025_usingimpersonation)), но потом я понял, что он создает контекст для запуска кода только на время запроса. И я хотел бы переключить весь сеанс чтобы сервер подумал, что я использую другой домен для входа в систему. У меня есть права администратора в моей учетной записи, поэтому он не предназначен для взлома или кражи паролей домена.

Возможно ли это вообще? Спасибо.

1 Ответ

7 голосов
/ 06 августа 2009

Допустим, у вас есть приложение ASP.NET с проверкой подлинности с помощью форм с формой входа login.aspx, и ваши пользователи хранятся в БД. Теперь вы хотите поддерживать проверку подлинности с помощью форм и Windows. Вот что я делаю:

Для аутентификации форм я использую БД SQL с, скажем, таблицей Users. Я добавляю в эту таблицу новый столбец с именем WindowsUserName, в котором я сохраню имя пользователя Windows в форме COMPUTER \ User

В форме login.aspx я добавляю метод, который отправит ответ, который покажет окно входа в систему:

private void ActivateWindowsLogin()
{
    Response.StatusCode = 401;
    Response.StatusDescription = "Unauthorized";
    Response.End();
}

Где-то у меня есть ссылка типа <a href="login.aspx?use=windows">Admin</a>

В login.aspx Page_Load я добавил:

if (Request.QueryString["use"] == "windows")
{
    var windowsuser = Request.ServerVariables["LOGON_USER"];
    if (windowsuser.Length == 0)
        ActivateWindowsLogin();
    else
    {
        // get userId from DB for Windows user that was authenticated by IIS
        // I use userId in .ASPXAUTH cookie
        var userId = GetUserIdForWindowsUser(windowsuser);
        if (userId > 0) //user found
        {
            // here we get User object to check roles or other stuff
            var user = GetApplicationUser(userId);
            // perform additional checks here and call ActivateWindowsLogin()
            // to show login again or redirect to access denied page.
            // If everythig is OK, set cookie and redirect
            FormsAuthentication.SetAuthCookie(userId.ToString(), false);
            Response.Redirect(FormsAuthentication.GetRedirectUrl(userId.ToString(), false), true);
        }
        else //user not found
            ActivateWindowsLogin();
    }
}
else
{
    //your Forms auth routine
}

GetUserIdForWindowsUser и GetApplicationUser - мои методы только для примера.

...