2012-01-23 33 views
8

Trong C#, làm cách nào để xác thực người dùng trên máy mạng? Ví dụ: tôi muốn xác thực người dùng testuser bằng mật khẩu testpassword trên máy EXAMPLEMACHINE từ một máy khác được kết nối mạng với EXAMPLEMACHINE. Ví dụ: Tôi đang ở trên MYMACHINE và tôi muốn xác thực testuser với testpassword trên EXAMPLEMACHINE.Trong C#, làm cách nào để xác thực người dùng trên máy mạng?

Tôi đã thử những điều sau đây nhưng nó vẫn không ngừng nói với tôi rằng, Máy chủ LDAP không có sẵn:

PrincipalContext context = 
    new PrincipalContext(ContextType.Domain, exampleMachineDomain); 
return context.ValidateCredentials(username, password); 
+1

bạn đã xác nhận rằng chuỗi kết nối để có được đến máy chủ ldap đang làm việc? Bạn đang sử dụng directoryservices hoặc làm điều này với chế độ xác thực cửa sổ trong cấu hình ứng dụng hoặc tệp cấu hình web? – Brian

+1

EXAMPLEMACHINE có phải là bộ điều khiển miền không? Nếu không, đó có thể là vấn đề của bạn. Tôi không biết liệu bạn có thể xác thực thông tin đăng nhập trên máy thông thường (nghĩa là không phải máy chủ) chỉ vì nó có thể hiển thị trên mạng hay không. Đó là những gì thông báo lỗi nói với bạn, tôi nghĩ vậy. – ken

+0

Đó là vấn đề. Tôi không có bộ điều khiển miền. Tôi muốn xác thực thông tin đăng nhập trên một máy thông thường, chỉ vì nó hiển thị trên mạng. – Alexandru

Trả lời

2

Nếu bạn là không sử dụng Active Directory, bạn có thể sử dụng một cái gì đó như thế này:

using System.Security; 
using System.DirectoryServices.AccountManagement; 
    public struct Credentials 
    { 
     public string Username; 
     public string Password; 
    } 
    public class Domain_Authentication 
    { 
     public Credentials Credentials; 
     public string Domain; 
     public Domain_Authentication(string Username, string Password, string SDomain) 
     { 
      Credentials.Username = Username; 
      Credentials.Password = Password; 
      Domain = SDomain; 
     } 
     public bool IsValid() 
     { 
      using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain)) 
      { 
       // validate the credentials 
       return pc.ValidateCredentials(Credentials.Username, Credentials.Password); 
      } 
     } 
    } 

Nếu bạn đang sử dụng Active Directory, bạn có thể sử dụng một cái gì đó như thế này:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain); 

    // define a "query-by-example" principal - here, we search for a UserPrincipal 
    UserPrincipal qbeUser = new UserPrincipal(ctx); 

    // if you're looking for a particular user - you can limit the search by specifying 
    // e.g. a SAMAccountName, a first name - whatever criteria you are looking for 
    qbeUser.SamAccountName = "johndoe"; 

    // create your principal searcher passing in the QBE principal  
    PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

    // find all matches 
    foreach(var found in srch.FindAll()) 
    { 
     // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
    } 
+1

Tôi không hiểu những ví dụ này ... Nó nói để sử dụng ValidateCredentials() khi không theo AD, và tìm kiếm thường xuyên nếu nó IS dưới AD - và mã AD thậm chí không đề cập đến mật khẩu của người dùng. Điều này thực sự thực hiện điều gì? –

+0

Có lẽ bạn cần hiểu 'PrincipalContext' trước khi bạn bình luận về điều gì đó bạn nên hiểu ngữ cảnh của nó. tại sao viết tất cả các loại mã bằng cách sử dụng AD khi PrincipalContext cung cấp cho bạn chức năng/truy cập mạnh mẽ hơn .. – MethodMan

+0

Như tôi đã cố gắng ám chỉ ... Tôi đang cố hiểu. Bạn có nghĩa là ví dụ đầu tiên ("không sử dụng AD") là khi bạn có miền cửa sổ pre-AD? Hoặc tại sao nó hoạt động với ContextType.Domain được chỉ định nếu không có miền AD? Và trong ví dụ thứ hai ("sử dụng AD"), ở đâu/như thế nào nó thực sự xác minh người dùng? (tôi.e tương ứng với tên người dùng/mật khẩu từ ví dụ đầu tiên). –

2

Nếu máy của bạn đang không ở trong một miền, bạn cần phải sử dụng ContextType.Machine:

PrincipalContext context = 
    new PrincipalContext(ContextType.Machine, exampleMachineDomain); 
return context.ValidateCredentials(username, password); 
1

Có một vài tùy chọn khác nhau được trình bày trong this answer. Tuy nhiên, đoạn trích bạn đã dán ở trên nên hoạt động.

1

Các cách tốt nhất để làm điều này sẽ là sử dụng WNetUseConnection, một API Win32 cho phép một cách trực tiếp nhất. Trong thực tế, bạn đang cố gắng gọi

net use \\server password /user:myUserName,

đó là những gì API này được thiết kế để làm.

Một ví dụ tốt về điều này đã được trả lời tại this question.

PinvokeWindowsNetworking hàm trả về null khi thành công, mã xác thực đơn giản nhất là

private static bool AuthenticateUserOnRemote(string server, string userName, string password) 
{ 
    var connected = PinvokeWindowsNetworking.connectToRemote(server, userName, password); 
    var disconnected = PinvokeWindowsNetworking.disconnectRemote(server); 
    return connected == null; 
} 
Các vấn đề liên quan