2

Active Directory 認証に関する何百万もの投稿を読みましたが、特に私の問題に関する投稿は見つかりませんでした。

MVC4フォーム認証を使用してActive Directoryに対してユーザーを認証し、オプションとしてドメイン名を挿入できるようにしたい:

acc: domain.com\username  or  username
pwd: password

私の会社には 20 のサブドメインがあり、各ドメインを認証する必要があります。そのため、ドメインをアプリ構成に保持してそこから選択するオプションが好きではありません。

ディレクトリ エントリ:

var directoryEntry = new DirectoryEntry("LDAP://" + domain, userName, password);

素晴らしいでしょうが、ユーザーがユーザー名の前にドメインを置かない場合はどうなりますか? 私は例外を受け取り、ユーザーは認証されません。メソッドが欲しい:

public bool AuthenticateUser(string username, string password)
{
   Checking if username has domain name included;
   use some kind of authetication method;
   returns true/false;
}

手動でユーザー名を解析し、すべての if 条件などをチェックすると、私の方法はがらくたのように見えます。おそらく、ユーザーがドメイン\ユーザー名またはユーザー名だけを入力できるようにするオプションを提供するアプリ構成のある種のパラメーターである可能性があります。次に、ドメイン + ユーザー名またはユーザー名のみを取得し、AD に対してユーザーを認証できます。

前もって感謝します。

4

1 に答える 1

2

Membership と PrincipalContext の両方を使用して、二重認証ソリューションの使用を試みることができます

public bool ActiveDirectoryAuthentication(string username, string password)
    {
        var splittedCredentials = username.Split(new[] { "\\" }, StringSplitOptions.None);
        switch (splittedCredentials.Length)
        {
            case 1:
                {
                    var authenticated = Membership.ValidateUser(username, password);
                    if (authenticated)
                    {
                        FormsAuthentication.SetAuthCookie(username, false);
                    }
                    return authenticated;
                }
            case 2:
                {
                    var principalContext = new PrincipalContext(ContextType.Domain, splittedCredentials[0]);

                    using (principalContext)
                    {
                        var authenticated = principalContext.ValidateCredentials(splittedCredentials[1], password);

                        if (authenticated)
                        {
                            FormsAuthentication.SetAuthCookie(splittedCredentials[1], false);
                        }
                        return authenticated;
                    }
                }
            default:
                return false;
        }
    }
  • その前に、ユーザー入力を検証することを忘れないでください
  • 最初にログイン文字列を分割します
  • ユーザーがドメインに入っていない場合は、メンバーシップを使用します
  • ユーザーがドメイン名を入力した場合は、PrincipalContext を使用します
  • 他のイベントが発生した場合は false を返します
于 2013-08-01T09:02:24.147 に答える