2017-06-21 8 views
0

MVC Web App(C#)のActive Directoryで資格情報を検証しようとしています。回答を検索する際に、私はNotImplementedExceptionsやその他の不思議なことに気付きました。 私が試したことや失敗したことの(包括的でない)リストです。Active Directoryに対するログイン検証C# - Visual Studio for Mac

まず、このコード:

string domainAndUsername = domain + @"\" + username; 
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd); 

try 
{ 
    //Bind to the native AdsObject to force authentication. 
    // This line throws a not implemented exception 
    object obj = entry.NativeObject; 

    DirectorySearcher search = new DirectorySearcher(entry) 
    { 
      Filter = "(SAMAccountName=" + username + ")" 
    }; 
    search.PropertiesToLoad.Add("cn"); 

    Console.WriteLine(search.ToString()); 

    SearchResult result = search.FindOne(); 

    //Debug.WriteLine(result.ToString()); 

    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; 

はラインobject obj = entry.NativeObjectは、私は(objは他の場所で使用されることはありませんので)行をコメントアウトしようとしたが、無駄にしましたNotImplementedExceptionをスローします。私は非常に似たようなコードの他のバリエーションも試しました。同じ考えの

var creds = new NetworkCredential(username, password); 
var srvid = new LdapDirectoryIdentifier(adPath); 
// This line throws a NotImplementedException 
var conn = new LdapConnection(srvid, creds); 

try 
{ 
    conn.Bind(); 
} 
catch (Exception) 
{ 
    return false; 
} 

conn.Dispose(); 

return true; 

そして、他のバリエーション:私が試み

他のルートは、このコードでした。ラインはvar conn = new LdapConnection(srvid, creds);NotImplementedException

を投げる最後に、私はシンプルなルートを行って、これは、Web APIで、私は、コントローラを使用しておりますので

Membership.ValidateUser(model.username, model.password) 

を使用しました。これにはWeb.config available hereのコードが必要です。それもNotImplementedExceptionを投げます。

これらの3つの一般的な方法はすべて、VS for Macでまだ実装されていない同じ基本機能に依存していますか?それとも私は行方不明のものがありますか?誰かが提供できる回避策がある場合でも、それは非常によく評価されるでしょう。

ありがとうございます!

+0

この段階では、Novell Ldapライブラリ経由で手動で達成することができます。 Microsoftはクロスプラットフォームの 'System.DirectoryServices'を開発中です。NET Coreを使用していますが、それがMonoへの適用範囲を拡張するかどうかは不明です。 –

+0

この質問/回答は役に立ちました: https://stackoverflow.com/questions/37330705/working-with-directoryservices-in-asp-net-core – bnem

+0

コメントありがとうございました。私は今Novell.Directory.Ldapを試しています。私は、正しい方向に一歩を踏み出すことになる 'Invalid Credentials'エラーを受けています。 – rtherman

答えて

0

あなたはMicrosoft.DirectoryServices.dll

System.DirectoryServices

を参照する必要がまず第一第二に、これは補助金のアクセスを持つドメインアカウントで照会を実行する必要があります。サーバー(iis)などで公開するときに注意してください。サービスがこのコードを実行し、そのコードにアクセス許可が必要だったからです。私の英語のため申し訳ありません

check this

:D

+0

これが含まれていれば、エラーは未定義クラスの行に沿ったものになります。例外によって判断されるクラスは定義されていますが実装されていません。 System.DirectoryServices.AccountManagementはVisual Studio for Mac([Monoのコードベース参照](https://github.com/mono/mono/tree/master/mcs/class)のライブラリとして存在しないため、PrincipalContextは未定義です(私もそれを試していた、申し訳ありませんが、私は質問でそれを言い忘れた)。 – rtherman

+0

OK、このクラスを使用する必要があります。https://github.com/mono/mono/blob/master/mcs/class/Mono.Directory.LDAP/Mono.Directory.LDAP/LDAP.cs –

0

Javier Jimenez Matillaの種類の努力のおかげで、bnem、およびLexi Liは、私はそれが動作するようになりました。

using Novell.Directory.Ldap; 
try 
{ 
    var conn = new LdapConnection(); 
    conn.Connect(domain, 389); 
    conn.Bind(LdapConnection.Ldap_V3, $"{subDomain}\\{username}", password); 
    return true; 
} 
catch (LdapException ex) 
{ 
    Console.WriteLine(ex.Message); 
    return false; 
} 

注意すべきいくつかのこと:問題の一部は、私は残念ながら(機密性とその他もろもろ)を開示することはできませんが、ここで最終的なコードだ構成の問題でした。まず、LdapConnectionは実際にはNovell.Directory.Ldap.LdapConnectionです。第2に、ハードコーディングされた389は、LDAP likes to communicate overのポートです。第3に、パラメータ$"{subDomain}\\{username}"は、ユーザ名がADに表示される方法です。私の場合、ドメインは "corporation.mycompany.com"の形式であり、ADではユーザー名がcorporation\usernameと表示されます。したがって、この例では、string subDomain = "corporation"

関連する問題