5

私は 2 つのドメインを扱っています。1 つは信頼できるドメインです。あるドメインに JohnSmith が存在し、別のドメインに別の JohnSmith が存在する場合があります。これらの人々は両方とも、私のアプリケーションにログインする必要があります。

私の問題: どのドメインを渡すかは問題ではありません - このコードは true を返します! どの JohnSmith がログインしているかを知るにはどうすればよいですか?

    static public bool CheckCredentials(
        string userName, string password, string domain)
    {
        using (var context = new PrincipalContext(ContextType.Domain, domain))
        {
            return context.ValidateCredentials(userName, password);
        }
    }
4

4 に答える 4

7

ValidateCredentialsおそらく、ログインとドメインを組み合わせて最初のuserPrincipalNameパラメーター (ユーザー名) を作成して、ユーザー名JohnSmith@dom1.comJohnSmith@dom2.com.

于 2012-02-28T05:09:58.577 に答える
4

を使用してログインしたユーザーの完全な DN をいつでも取得できます。

UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName);
up.UserPrincipalName // shows user@domain.com
up.DistinguishedName // shows CN=Surname,OU=group,DC=domain,DC=com
up.SamAccountName    // shows login name

ドメイン名を含む ValidateCredentials への後続の呼び出しに up.SamAccountName を使用します。結局のところ、同じ sAMAccountName を使用してログインする 2 人のユーザーを持つことはできません!

DistinguishedName は、どの JohnSmith がログインしたかを確実に示します。

于 2014-07-04T14:59:46.190 に答える
3

JPBlancの回答に基づいて、コードを書き直しました。偽のドメインが渡された場合に備えて、try/catchも追加しました。

    static public bool CheckCredentials(
        string userName, string password, string domain)
    {
        string userPrincipalName = userName + "@" + domain + ".com";

        try
        {
            using (var context = new PrincipalContext(ContextType.Domain, domain))
            {
                return context.ValidateCredentials(userPrincipalName, password);
            }
        }
        catch // a bogus domain causes an LDAP error
        {
            return false;
        }
    }
于 2012-02-28T19:18:16.323 に答える
0

承認された回答は、ドメイン内に異なる電子メール アドレスが含まれるドメインでは失敗します。例:

Domain = Company

User1 = employee@department1.com (under company Domain)

User2 = employee2@Department2.com (under company Domain)

提供された回答は、次を使用して false を返します。

userName = "employee";
domain = "company";
string userPrincipalName = userName + "@" + domain + ".com";

複数のドメインにまたがるユーザーを含める正しい方法は次のとおりです。

string userPrincipalName = userName + "@" + domain;

.com 部分がない場合、グローバル ドメイン内の電子メールを検索する代わりに、そのドメインでユーザーを検索します。

于 2013-12-05T16:24:12.333 に答える