1

.Net Web アプリケーションのセキュリティを処理するタスクがあります。ユーザーが Active Directory にログインしていて、ユーザーの AD 名がデータベースにある場合、そのユーザーは許可されます。

同じ基準で、ユーザーの AD 名がデータベースにない場合、データベースに保持されているユーザー名とパスワードを使用してログインするよう求められます。

そのため、メンバーシップとロール プロバイダーを使用した、ある種の混合モード セキュリティ ログインが必要です。

私が問題を抱えているのは、ユーザーが AD を使用してログインできるかどうかを検出する場所です。そのため、ユーザーは自動的にログインします。

4

1 に答える 1

1

ActiveDirectoryMembershipProvider から継承するカスタム MembershipProvider を実装する必要があるようです。

少なくとも、が false を返したValidateUser場合に SQL データベースでユーザーの検証を試行できるようにオーバーライドする必要があります。base.ValidateUser次のコード サンプルはテスト アプリケーションで動作しますが、SQL メソッドは実装していません。それはあなたにとってかなり簡単なはずです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Configuration;
using System.Configuration.Provider;

namespace Research.Web.Security
{
    public class MixedMembershipProvider : ActiveDirectoryMembershipProvider
    {
        protected String SqlConnectionString { get; private set; }

        private String GetConnectionString(String connectionStringName)
        {
            if (string.IsNullOrEmpty(connectionStringName))
                throw new ProviderException("ConnectionStringName must be specified.");

            ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[connectionStringName];
            if (settings == null)
            {
                throw new ProviderException(String.Format("Connection string {0} not found.", connectionStringName));
            }
            return settings.ConnectionString;
        }

        public override void Initialize(String name, System.Collections.Specialized.NameValueCollection config)
        {
            this.SqlConnectionString = GetConnectionString(config["sqlConnectionStringName"]);
            config.Remove("sqlConnectionStringName");

            base.Initialize(name, config);
        }

        public override Boolean ValidateUser(String username, String password)
        {
            if (!base.ValidateUser(username, password)) // validate using AD first
            {
                return ValidateUserSql(username, password); // if not in AD, check SQL
            }
            else
            {
                return true;
            }
        }

        private Boolean ValidateUserSql(String username, String password)
        {
            // look up your account in SQL here
            return true;
        }
    }
}

Web 構成は次のようになります。

<configuration>
  <!-- usual config stuff omitted -->
  <connectionStrings>
    <add name="SqlDefault" connectionString="Server=localhost;database=mydatabase;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    <add name="ActiveDirectoryDefault" connectionString="LDAP://mydomain.com/DC=mydomain,DC=com" />
  </connectionStrings>

   <system.web>
 <!-- usual config stuff omitted -->
   <membership defaultProvider="Mixed">
      <providers>
        <clear/>
        <add name="Mixed"
             type="Research.Web.Security.MixedMembershipProvider, Research.Web"
             applicationName="/"
             connectionStringName="ActiveDirectoryDefault"
             sqlConnectionStringName="SqlDefault"
             connectionUsername="mydomain\myadmin" 
             connectionPassword="mypass"/>
      </providers>
    </membership>
    <!--- usual config stuff omitted -->
   </system.web>
</configuration>

上記のコードは基本認証で機能しますが、アカウントが AD ではなく SQL にある場合に備えて、パスワードのリセットや検索などを処理するために、他の方法のいくつかをオーバーライドする必要がある場合があります。

于 2009-10-26T19:32:56.177 に答える