2012-06-28 154 views
13

我正在嘗試開發一個簡單的Web服務,以使用Windows標識框架對桌面應用程序的用戶進行身份驗證,目前我通過post變量傳遞由WindowsIdentity.GetCurrent().Token生成的令牌(它已加密並且ssl'd ,鑑於我們域的佈局和服務器的配置,Windows身份驗證不是一個選項)。我正在將該令牌恢復正常並將其轉回IntPtr驗證Windows標識令牌

我對如何驗證令牌以確保它是由特定的Active Directory(或任何相關事件)生成的丟失。我試圖創建一個新的WindowsIdentity實例,但只會產生一個異常(消息:用於模擬的無效令牌 - 它不能被複制)。

如果任何人都可以提供任何幫助,甚至提示,我將不勝感激,在此先感謝。

+0

當使用令牌訪問資源時,是否可以使用令牌並將驗證留在Windows上? –

+2

在我的情況下,我使用自定義套接字客戶端/服務器解決方案,我想使用Windows身份驗證來驗證用戶。因此,我需要傳輸一個令牌或類似的服務器進行身份驗證,但我不明白如何。 MSDN不是很有幫助。 – jgauffin

+0

客戶端和服務器在同一個域上嗎?登錄到Windows時,客戶端是否對域進行身份驗證? –

回答

-1

好,

如果我理解正確的話你的問題,我知道這是可能做到這一點做的直接API調用。 Advapi32.dll中的LogonUser就是答案。下面的代碼段爲我工作

public class ActiveDirectoryHelper 
{ 
    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool CloseHandle(IntPtr hObject); 

    public static bool Authenticate(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 

     bool isAuthenticated = token != IntPtr.Zero; 

     CloseHandle(token); 

     return isAuthenticated; 
    } 

    public static IntPtr GetAuthenticationHandle(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 
     return token; 
    } 


} 
1
public bool DoesUserExist(string userName) 
{ 
    using (var domainContext = new PrincipalContext(ContextType.Domain, "DOMAIN")) 
    { 
     using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName)) 
     { 
      return foundUser != null; 
     } 
    } 
} 

爲了實現檢查用戶是否存在。這來自System.DirectoryServices.AccountManagement命名空間和程序集。

只需傳入您的用戶名,您可以從WindowsIdentity.GetCurrent()獲得該用戶名,如果用戶在用戶組中,則該用戶將返回true/false。 (用你需要的組名替換DOMAIN)