2009-05-21 7 views
16

Je suis actuellement en train de concevoir un système d'adhésion/profil pour un nouveau projet sur lequel je travaille et j'espérais obtenir des contributions d'autres personnes.Fournisseur d'appartenance ASP.NET Active Directory et fournisseur de profils SQL

Le projet est une application Web ASP.NET et en raison du court laps de temps, j'essaie d'utiliser tous les composants de framework .NET intégrés que je peux. Le site va probablement divertir < 5000 utilisateurs. Chaque utilisateur aura un profil où les paramètres personnalisés et les objets seront conservés entre les visites.

Je dois utiliser un annuaire Active Directory existant pour l'authentification. Comme le schéma AD ne peut pas être étendu pour contenir de nouveaux champs, je dois conserver les paramètres utilisateur et les objets dans un magasin de données différent. On m'a également dit ADAM n'est probablement pas une solution possible. Je souhaitais utiliser le fournisseur d'appartenance Active Directory pour mon schéma d'authentification et le fournisseur de profils SQL comme magasin de données de profil utilisateur. Je préférerais ne pas créer un fournisseur de profil personnalisé, mais je ne vois pas cela poser un gros problème si besoin est.

Je me demandais si c'était une solution possible, et si oui, quelqu'un a-t-il eu de la chance avec cette approche.

Tous les commentaires seraient grandement appréciés.

Merci.

Répondre

15

Tout d'abord, je ne l'ai jamais fait moi-même.

Il ya une série vraiment excellente (14 pièces) sur le sujet entier de l'adhésion à ASP.NET 2.0, les rôles et les systèmes de fournisseur de profil par Scott Mitchell au 4 Guys from Rolla.

Selon ma compréhension, vous devriez être en mesure de configurer ce comportement que vous recherchez en utilisant essentiellement ces deux sections dans votre web.config:

<!-- configure Active Directory membership provider --> 
    <membership defaultProvider="AspNetActiveDirectoryMembershipProvider"> 
    <providers> 
     <add name="AspNetActiveDirectoryMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider, 
       System.Web, Version=2.0.3600, Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" /> 
    </providers> 
    </membership> 

    <!-- configure SQL-based profile provider -->  
    <profile defaultProvider="SqlProvider"> 
    <providers> 
     <add name="SqlProvider" 
     type="System.Web.Profile.SqlProfileProvider" 
     connectionStringName="SqlProfileProviderConnection" 
     applicationName="YourApplication" /> 
    </providers> 

    <!-- specify any additional properties to store in the profile --> 
    <properties> 
     <add name="ZipCode" /> 
     <add name="CityAndState" /> 
    </properties> 
    </profile> 

Je pense cela devrait fonctionner :-)

+0

Merci Marc. J'ai donné un coup de feu ce matin et tout s'est bien passé. Merci de votre aide! – cmcginty

+0

si nous utilisons AD pour l'adhésion et l'authentification et aspnet_profile pour stocker le profil. Comment la relation est-elle créée et gérée? Identifiant d'utilisateur. En d'autres termes, comment asp.net se base-t-il sur l'attribut de AD pour générer UserId? –

+0

Pourriez-vous s'il vous plaît répondre http://stackoverflow.com/questions/9588265/understanding-wcf-windows-authentication? – Lijo

3

en plus de cela comme répondu par Marc:

<add name="AspNetActiveDirectoryMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider, 
       System.Web, Version=2.0.3600, Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" /> 

vous pourriez aussi avoir besoin d'ajouter

connectionStringName="ADService", 
attributeMapUsername="sAMAccountName" 

avec chaîne de connexion corresponnding

<connectionStrings> 
    <add name="ADService" connectionString="LDAP://ServerIP" /> 
</connectionStrings> 

Si vous utilisez .net 4.0, vous devrez remplacer

Version=2.0.3600 

avec

Version=4.0.0.0 

Alors finalement,

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider"> 
     <providers> 
     <add name="AspNetActiveDirectoryMembershipProvider" 
      connectionStringName="ADService" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider, 
       System.Web, Version=4.0.0.0, Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" 
      attributeMapUsername="sAMAccountName"/> 
     </providers> 
    </membership> 

et puisqu'il est défini par défaut, il peut être référencé comme:

MembershipProvider provider = Membership.Provider; 
2

Merci pour l'information, l'a beaucoup aidé.Aussi, plutôt que de définir le fournisseur par défaut avec MembershipProvider provider = Membership.Provider;, vous pouvez le définir avec dans la balise d'adhésion.

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

I "ai aussi écrit un petit comment et un téléchargement à un projet Visual Studio et Source configuré pour utiliser AspNetActiveDirectoryMembershipProvider.

ASP.NET Forms Based Authentication - using AspNetActiveDirectoryMembershipProvider

2

J'utilise Visual Studio 2012 et essayé pour faire comme sugested, mais une erreur est affichée:

To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider". 

Alors j'ai découvert que quelques modifications doivent être faites au formulaire de connexion par défaut sur le VS2012 avec MVC 4 et Entity Framework comme suit:

sur le fichier « AccountController.cs »

sur le « public ActionResult Connexion (modèle LoginModel, chaîne returnUrl) »

Modifier le

if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) 

pour

if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password)) 

sur le "public ActionResult LogOff()"

Modifier le

WebSecurity.Logout(); 

pour

FormsAuthentication.SignOut(); 

et ajouter ce qui suit: FormsAuthentication.SetAuthCookie (model.UserName, false);

public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password)) 
     { 

      FormsAuthentication.SetAuthCookie(model.UserName, false);    

      return RedirectToLocal(returnUrl); 
     } 

     // If we got this far, something failed, redisplay form 
     ModelState.AddModelError("", "The user name or password provided is incorrect."); 
     return View(model); 
    } 
+0

+1 merci! C'est exactement ce qui a réglé le problème pour moi. Je n'ai trouvé nulle part ailleurs cette information lors de la recherche de problèmes avec 'AspNetActiveDirectoryMembershipProvider'. –