5

Active Directory サーバーに対してユーザーを認証する Web アプリケーションを開発しています。その AD サーバーのドメインで開発用 PC からコードを実行すると、コードはスムーズに実行されます。VPN を使用してまったく別のネットワークからコードを実行する必要がありますが、開発用 PC はその AD に接続されていません。AD サーバーにアクセスしようとすると、次のエラーが発生します。

指定されたドメインが存在しないか、接続できませんでした。

私の VPN は正常に動作しています。この VPN を使用してリモート デスクトップにアクセスできました。問題を解決するには少し調整が必要であることはわかっていますが、見つけることができませんでした。次のリンクをたどりましたが、解決策が見つかりませんでした。

  1. VPN を介した .NET クライアントからのドメイン認証

  2. Windows フォーム アプリで VPN ユーザーの現在のユーザー ID を取得するにはどうすればよいですか?

以下は私の設定ですweb.config

<appSettings>
   <add key="LDAPPath" value="LDAP://DC=MYSERVER,DC=COM" />
   <add key="ADGroupName" value="Analyst"/>
</appSettings>

ここに私のコードがあります

public class LdapAuthentication
{
    private string _path;
    private string _filterAttribute;

    public LdapAuthentication()
    {
        _path = System.Configuration.ConfigurationManager.AppSettings["LDAPPath"].ToString();
    }

    public bool IsAuthenticated(string username, string pwd)
    {
        try
        {
            DirectoryEntry entry = new DirectoryEntry(_path, username, pwd);

            entry.Path = _path;
            entry.Username = username;
            entry.Password = pwd;

            // Bind to the native AdsObject to force authentication.
            object obj = entry.NativeObject;

            DirectorySearcher search = new DirectorySearcher(entry);

            search.Filter = "(SAMAccountName=" + username + ")";
            search.PropertiesToLoad.Add("cn");
            SearchResult result = search.FindOne();

            if (null == result)
            {
                return false;
            }

            // Update the new path to the user in the directory.
            _path = result.Path;
            _filterAttribute = (string)result.Properties["cn"][0];
        }
        catch (Exception ex)
        {
            throw new Exception("Error authenticating user. " + ex.Message);
        }

        return true;
    }
}

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

私は同様の、より単純な問題を抱えていました。次のコードを使用して成功しました。

private bool DoLogin(string userName, string password)
{
    using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DomainName.com")) {
        bool isValid = pc.ValidateCredentials(userName, password);
        if (isValid) {
            // authenticated
            ...
            return true;
        }
        else {
            // invalid credentials
            ...
            return false;
        }
    }
}

ドメイン名の最後に「.com」を使用することは、私にとってそれを機能させるために重要でした. それがなければ、あなたが説明したのと同じ症状が出ました。

于 2014-09-03T23:28:21.447 に答える