web-dev-qa-db-ja.com

ASP.NET MVC-Active Directoryに対してユーザーを認証しますが、ユーザー名とパスワードを入力する必要があります

ADに対してユーザーを認証する必要があるMVC3アプリケーションを開発しています。 MVC3には、ADに対してユーザーを自動的に認証するイントラネットアプリケーションを作成するオプションがあることを知っていますが、Windows認証を使用して自動的にログオンします。このアプリケーションは、ユーザーがドメインユーザー名とパスワードを入力する必要がある「オープン」ワークステーションでアクセスできます。例やオンラインチュートリアルはすばらしいものです。サンプルプロジェクトは例外的です。

44
munchrall

標準のインターネットアプリケーションテンプレートをフォーム認証で使用し、ActiveDirectoryMembershipProviderweb.configに挿入できます。

<connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://YOUR_AD_CONN_STRING" />
</connectionStrings>

<system.web>
    <authentication mode="Forms">
        <forms name=".ADAuthCookie" loginUrl="~/Account/LogOn"
               timeout="15" slidingExpiration="false" protection="All" />
    </authentication>
    <membership defaultProvider="MY_ADMembershipProvider">
        <providers>
            <clear />
            <add name="MY_ADMembershipProvider" 
                 type="System.Web.Security.ActiveDirectoryMembershipProvider" 
                 connectionStringName="ADConnectionString"
                 attributeMapUsername="sAMAccountName" />
        </providers>
    </membership>
</system.web>

このようにして、インターネットアプリケーションテンプレートのログインフォームを取得し、ADに対して検証します。

その後、パスワードをリセットする/パスワードを変更する/登録機能を削除するだけで、Loginだけを残してAccountControllerを整理するだけです。

44
Khepri

上記のように、web.configファイルで定義されたメンバーシッププロバイダーを使用できます。

以下のコードは、MVC 3テンプレートコードの「AccountController」の実装内にあり、ActiveDirectoryで動作するようにわずかに変更されています。

 [HttpPost]
    public ActionResult LogOn( LogOnModel model, string returnUrl )
    {
      if( ModelState.IsValid )
      {
        // Note: ValidateUser() performs the auth check against ActiveDirectory
        // but make sure to not include the Domain Name in the User Name
        // and make sure you don't have the option set to use Email Usernames.
        if( MembershipService.ValidateUser( model.UserName, model.Password ) )
        {
            // Replace next line with logic to create FormsAuthenticationTicket
            // to encrypt and return in an Http Auth Cookie or Session Cookie
            // depending on the 'Remember Me' option.
            //FormsService.SignIn( model.UserName, model.RememberMe );

            // Fix this to also check for other combinations/possibilities
            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

.NET 3.5を使用している場合 この記事 を代わりに読んでください:

10
cpoDesign