2009-05-21 23 views
16

Actualmente estoy diseñando un esquema de Membresía/Perfil para un nuevo proyecto en el que estoy trabajando y esperaba obtener información de otros.Proveedor de membresía de ASP.NET Active Directory y proveedor de perfiles de SQL

El proyecto es una aplicación web ASP.NET y, debido al corto espacio de tiempo, estoy tratando de utilizar todos y cada uno de los componentes del framework .NET que pueda. El sitio probablemente entretendrá a < 5000 usuarios. Cada usuario tendrá un perfil donde la configuración personalizada y los objetos se conservarán entre visitas.

Estoy obligado a utilizar un Active Directory existente para la autenticación. Como el esquema de AD no puede extenderse para contener campos nuevos, debo mantener la configuración y los objetos del usuario en un almacén de datos diferente. También me han dicho que ADAM probablemente no sea una solución posible.

Esperaba utilizar el Proveedor de Membresía de Active Directory para mi esquema de autenticación y el Proveedor de Perfil SQL como un almacén de datos de perfil de usuario. Preferiría no crear un proveedor de perfil personalizado, pero no veo que esto represente un gran problema si es necesario.

Me preguntaba si esto es incluso una posible solución, y si es así, alguien ha tenido suerte con este enfoque.

Cualquier comentario sería muy apreciado.

Gracias.

Respuesta

15

Primero, nunca he hecho esto yo solo.

Hay una serie realmente excelente (14 !! partes) sobre el tema completo de la membresía ASP.NET 2.0, roles y sistemas de proveedor de perfiles de Scott Mitchell al 4 Guys from Rolla.

Según mi entender, debe ser capaz de configurar este comportamiento que busca, básicamente, mediante el uso de estas dos secciones en su 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> 

Yo creo que esto se debe trabajar :-)

+0

Gracias Marc. Le di una oportunidad esta mañana y todo salió bien. ¡Gracias por tu ayuda! – cmcginty

+0

si usamos AD para membresía y autenticación y aspnet_profile para almacenar el perfil. Cómo se está creando y administrando la relación, es decir. Identidad de usuario. En otras palabras, ¿cómo sabe asp.net en función de qué atributo de AD generar UserId? –

+0

¿Podría responder http://stackoverflow.com/questions/9588265/understanding-wcf-windows-authentication? – Lijo

3

Además de esto como respondió por Marc:

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

también podría ser necesario añadir

connectionStringName="ADService", 
attributeMapUsername="sAMAccountName" 

con cadena de conexión corresponnding

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

Si está utilizando .NET 4.0, entonces tendrá que reemplazar

Version=2.0.3600 

con

Version=4.0.0.0 

Así que, finalmente,

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

y dado que se establece de forma predeterminada, se puede hacer referencia como:

MembershipProvider provider = Membership.Provider; 
2

Gracias por la información, su ayudado mucho.Además, en lugar de Establecer el proveedor predeterminado con MembershipProvider provider = Membership.Provider;, puede configurarlo en la etiqueta de membresía.

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

I "También he escrito un pequeño cómo y una descarga a un proyecto de Visual Studio y Fuente configurado para utilizar AspNetActiveDirectoryMembershipProvider.

ASP.NET Forms Based Authentication - using AspNetActiveDirectoryMembershipProvider

2

Estoy utilizando Visual Studio 2012 y trató hacer lo que se sugiere, pero se muestra un error:

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

Así que descubrí que algunos cambios se deben hacer a la forma de la conexión por defecto en el VS2012 con MVC 4 y marco de la entidad de la siguiente manera:

el archivo "AccountController.cs"

en el "ActionResult pública de sesión (modelo LoginModel, cuerda ReturnURL)"

Cambiar el

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

para

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

en el "cierre de sesión ActionResult pública()"

Cambiar el

WebSecurity.Logout(); 

para

FormsAuthentication.SignOut(); 

y añadir lo siguiente: 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 ¡gracias! Esto fue exactamente lo que me solucionó el problema. En ninguna otra parte he encontrado esta información cuando busco problemas con 'AspNetActiveDirectoryMembershipProvider'. –

Cuestiones relacionadas