2012-06-28 74 views
13

Windows kimlik çerçevesini kullanarak bir masaüstü uygulamasının kullanıcılarının kimliğini doğrulamak için basit bir web hizmeti geliştirmeye çalışıyorum, şu anda WindowsIdentity.GetCurrent().Token tarafından oluşturulan bir iletiyi bir ileti değişkeni üzerinden geçiriyorum (şifreli ve ssl'd Windows kimlik doğrulaması, etki alanımızın düzenini ve sunucunun yapılandırması verilen bir seçenek değildir). Jetonu arkaya doğru geçiriyorum ve onu IntPtr'a dönüyorum.Windows Kimlik Simgesini Doğrulayın

Belirli bir Active Directory (veya bu konuyla ilgili herhangi bir) tarafından üretildiğinden emin olmak için belirtecin nasıl doğrulanacağı konusunda kaybolanıyorum. Belirteç verilen yeni bir WindowsIdentity örneğini oluşturmaya çalıştım ancak yalnızca bir Özel Durum ile sonuçlanır (ileti: kimliğe bürünme için geçersiz belirteç - çoğaltılamaz).

Herhangi biri size herhangi bir yardım veya ipucu verebilirse çok teşekkür ederim, şimdiden teşekkürler.

Sorunuzu doğru anlamak

+0

Bir belirteci kullanmak için belirteci kullandığınızda, belirteci kullanmak ve doğrulama işlemini Windows'a bırakmak mümkün mü? –

+2

Durumumda, windows kimlik doğrulaması kullanan kullanıcıların kimliğini doğrulamak istediğim özel bir yuva istemci/sunucu çözümü kullanıyorum. Bu nedenle, kimlik doğrulaması için bir jetonu veya sunucuya benzer bir şekilde nakledmem gerekiyor, fakat nasıl olduğunu anlamıyorum. MSDN çok yararlı değil. – jgauffin

+0

İstemci ve sunucu aynı etki alanında mı? İstemci, pencerelere giriş yaparken alan adına kimlik doğrulaması yapıyor mu? –

cevap

-1

Eh, buna doğrudan API çağrıları yapıyor yapmak mümkün olduğunu biliyorum. Advapi32.dll dosyasındaki LogonUser yanıttır. Aşağıdaki kod parçası, bir kullanıcı varsa kontrol elde etmek için beni

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

çalıştı. Bu, System.DirectoryServices.AccountManagement ad alanı ve derlemesinden gelir.

Kullanıcı adınızı, WindowsIdentity.GetCurrent()'dan alabileceğiniz kullanıcı adınızı geçirmeniz yeterlidir ve eğer kullanıcı grubunuzda varsa kullanıcı doğru/yanlış döndürecektir. (DOMAIN alanını gerekli grup adınızla değiştirin.)

İlgili konular