2012-01-23 6 views
8

C#では、ネットワークマシンでユーザーを認証するにはどうすればよいですか?たとえば、パスワードtestpasswordのユーザーtestuserを、EXAMPLEMACHINEにネットワーク接続されている別のマシンのEXAMPLEMACHINEマシンで認証したいとします。たとえば、MYMACHINEにあり、testusertestpasswordEXAMPLEMACHINEで認証したいとします。C#では、ネットワークマシン上のユーザーを認証するにはどうすればよいですか?

私は次のことを試してみましたが、LDAPサーバが利用できない、ということを私に言って続けて:

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

あなたは、接続文字列は、LDAPサーバに到達するために働いていることを確認したときに成功したPinvokeWindowsNetworking関数はnullを返しますので?ディレクトリサービスを使用しているのですか?または、これをアプリの設定ファイルまたはWeb設定ファイルのWindows認証モードで行いますか? – Brian

+1

EXAMPLEMACHINEはドメインコントローラですか?そうでなければ、それはあなたの問題かもしれません。ネットワーク上に表示されているため、正規の(つまりサーバー以外の)マシンで資格情報を検証できるかどうかはわかりません。それはエラーメッセージがあなたに伝えていることです、と私は思います。 – ken

+0

それが問題です。私はドメインコントローラを持っていません。通常のマシンで資格情報を検証したいのは、ネットワーク上に表示されているからです。 – Alexandru

答えて

2

Active Directoryを使用してされていない場合、あなたはこのようなもの使用することができます

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

私はこれらの例を理解していません... ADの下にないときはValidateCredentials()を使用し、ADの場合は通常の検索を行い、ADコードにはユーザーのパスワードについても言及していません。これは本当に何を達成するのですか? –

+0

文脈を理解しなければならないものにコメントする前に、おそらく 'PrincipalContext'を理解する必要があります。 PrincipalContextがより堅牢な機能/アクセスを提供するとき、なぜADを使用してすべての種類のコードを書くのですか? – MethodMan

+0

私が暗示しようとしたように...私は理解しようとしています。最初の例(「ADを使用しない」)は、ADの前のWindowsドメインを使用している場合ですか?または、ADドメインが存在しない場合、ContextType.Domainが指定されていると、なぜ動作しますか? 2番目の例(「ADの使用」)では、/どのようにしてユーザーを実際に検証していますか? (私。eは最初の例のユーザー名/パスワードに対応しています)。 –

2

あなたのマシンがドメインにない場合は、あなたがContextType.Machineを使用する必要があります。

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

this answerにはいくつかのオプションがあります。あなたがの上に貼り付けたスニペットはでなければなりません。

1

:Active Directoryを使用している場合、あなたはこのようなものを使用することができ

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

をこれを行う最善の方法は、WNetUseConnection、最も直接的な方法を可能にするWin32 APIを使用することです。実際には、あなたは、

net use \\server password /user:myUserNameを呼び出すために、このAPIを行うことを意図しているものです

をしようとしています。

これの良い例はthis questionです。

、最も単純な認証コードが

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; 
} 
関連する問題