2011-12-15 1 views
1

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

Сообщение об ошибке, с которого я вернусь, является ошибкой входа в систему для домена пользователя \ machinename $ '.

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

+0

ли ваш SQL имя пользователя и пароль, указанный в строке подключения, или вы полагаетесь на проверку подлинности Windows? –

+0

только проверка подлинности Windows – edepperson

ответ

1

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

Добавить их к своему usings,

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(); 
}