как получить HttpModule для аутентификации в SqlServer - PullRequest
1 голос
/ 15 декабря 2011

Мне нужно добавить вызов базы данных в HttpModule. Я использовал ту же строку подключения, которую мы используем для нашей службы WCF, размещенной на IIS, однако HttpModule не может аутентифицироваться. (Мы используем проверку подлинности Windows, и да, служба WCF выполняет проверку подлинности)

Я получаю сообщение об ошибке: «Ошибка входа в домен пользователя \ machinename $ '.

Что мне нужно сделать, чтобы HttpModule проходил аутентификацию на Sql Server 2008?

1 Ответ

1 голос
/ 16 декабря 2011

На случай, если кто-то столкнется с той же проблемой, что и я, вот ответ, который будет работать. Большая часть кода была взята с сайта MSDN ... это работает. Но, по сути, вы хотите выдать себя за нужного вам пользователя.

Добавьте это к вашим обычаям,

using System.Web.Security;
using System.Runtime.InteropServices;
using System.Security.Principal;

Напишите следующий метод:

private bool impersonateValidUser(String userName, String domain, String password)
{
    WindowsIdentity tempWindowsIdentity;
    IntPtr token = IntPtr.Zero;
    IntPtr tokenDuplicate = IntPtr.Zero;

    if (RevertToSelf())
    {
        if (LogonUserA(userName, domain, password,  LOGON32_LOGON_INTERACTIVE,
            LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {
            if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
            {
                tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                impersonationContext = tempWindowsIdentity.Impersonate();
                if (impersonationContext != null)
                {
                    CloseHandle(token);
                    CloseHandle(tokenDuplicate);
                    return true;
                }
            }
        }
    }
    if (token != IntPtr.Zero)
        CloseHandle(token);
    if (tokenDuplicate != IntPtr.Zero)
        CloseHandle(tokenDuplicate);
    return false;
}

внедрить, где необходимо

if (impersonateValidUser("username", "domain", "password"))
{
// code that needs to access Db
// make sure you undo when no longer needed
impersonationContext.Undo();
}
...