2011-12-15 27 views
1

我需要添加一個數據庫調用HttpModule。我使用了與IIS託管的WCF服務相同的連接字符串,但是HttpModule無法進行身份驗證。 (我們使用Windows身份驗證,並且是WCF服務進行身份驗證)如何獲得一個HttpModule認證到SqlServer

我返回的錯誤消息是用戶域\ machinename $'登錄失敗。

我需要做什麼才能讓HttpModule在Sql Server 2008上進行身份驗證?

+0

是你的SQL用戶名和連接字符串中指定的密碼,或你依靠Windows身份驗證嗎? – 2011-12-15 17:15:35

回答

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