2009-10-19 5 views
1

J'ai une tâche de gestion de la sécurité sur mon application web .Net, la façon dont cela fonctionne est que si l'utilisateur est connecté à Active Directory Sur la même base, si le nom de l'utilisateur AD ne figure pas dans la base de données, il sera demandé à l'utilisateur de se connecter avec un nom d'utilisateur et un mot de passe. dans la base de données.Sécurité en utilisant le fournisseur d'adhésion qui prendra en charge Active Directory et votre propre fournisseur sur mesure

J'ai donc besoin d'un type de connexion de sécurité en mode de mixage en utilisant le fournisseur d'appartenance et de rôle. Où j'ai de la difficulté est où vous détectez si un utilisateur peut se connecter en utilisant AD, donc ils se connectent automatiquement.

Répondre

1

Il semblerait que vous deviez implémenter un MembershipProvider personnalisé qui hérite de ActiveDirectoryMembershipProvider.

Au minimum, vous devrez remplacer ValidateUser de sorte que si le base.ValidateUser renvoie la valeur false, vous pouvez tenter de valider l'utilisateur dans votre base de données SQL. L'exemple de code suivant fonctionne dans mon application de test, mais je n'ai pas implémenté la méthode SQL. Cela devrait être assez simple pour vous.

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; 
     } 
    } 
} 

Votre config web ressemblerait à quelque chose comme ceci:

<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> 

Le code ci-dessus fonctionnera pour l'authentification de base, mais vous devrez peut-être remplacer certaines des autres méthodes pour gérer réinitialisations de mot de passe, les recherches, etc. pour l'éventualité qu'un compte est en SQL et non AD.