2009-10-31 16 views
5

¿Cómo puedo vincular mi proveedor de membresía personalizado con mi atributo ASP.NET MVC [Autorizar()]? Abrí varios tutoriales sobre cómo crear un proveedor de membresía personalizado, pero toda la información que encontré sobre cómo conectarlo a una aplicación parece girar en torno a las aplicaciones normales de ASP.NET WebForms que parecen ser una pieza de pastel.¿Cómo puedo adjuntar un proveedor de membresía personalizado en mi aplicación ASP.NET MVC?

Me estoy despegando con la cantidad de "magia" que acaba de suceder en ASP.NET MVC, que es genial, pero estoy acostumbrado a conectar cosas de forma WebForms por lo que esta metodología "simplemente funciona" es un poco emocionante para mí. ¿Cómo sé cuándo se supone que debo hacer el trabajo pesado o se supone que solo debo confiar en que suceda por arte de magia?

¿Dónde ato mi proveedor a una aplicación MVC? ¿Estoy en lo cierto al suponer que se invoca a través del atributo [Autorizar()] una vez que lo conecto?

Respuesta

6

Espero que pueda agregar algo de claridad adicional sobre las otras respuestas, ya que realmente no explican lo que está sucediendo, lo que no ayudará a confundir.

En primer lugar, poner en práctica su proveedor personalizado que desde el sonido de las cosas que has hecho ya, así que voy a vomitar un pequeño fragmento de código y no vamos a entrar en detalles más aquí:

using System.Web.Security; 

public class MyCustomMembershipProvider : MembershipProvider 
{ 
    public override bool ValidateUser(string username, string password) 
    { 
     if (username.Equals("BenAlabaster") && password.Equals("Elephant")) 
      return true; 

     return false; 
    } 

    /* Override all the other methods required to extend MembershipProvider */   
} 

Luego de configurar el proveedor en su web.config asegurándose de rellenar los atributos que configuran la base de MembershipProvider:

<membership defaultProvider="MyCustomMembershipProvider">  
    <providers>   
     <clear />   
     <add name="MyCustomMembershipProvider" 
      type="MyNamespace.MyCustomMembershipProvider" 
      enablePasswordRetrieval="false" 
      enablePasswordReset="true"   
      requiresQuestionAndAnswer="false"   
      requiresUniqueEmail="true"   
      passwordFormat="Hashed"   
      maxInvalidPasswordAttempts="10"   
      minRequiredPasswordLength="6"   
      minRequiredNonalphanumericCharacters="0"   
      passwordAttemptWindow="10"   
      passwordStrengthRegularExpression=""   
      applicationName="/" />  
    </providers>  
</membership> 

el siguiente bit Creo que estás pensando demasiado, el tie-in real para su aplicación web . Mientras que en una aplicación de WebForms tienes que codificar el resto para ti - el framework MVC hace el resto para ti - todo lo que necesitas hacer es agregar el atributo [Authorize] a tu método de acción y el framework verificará para ver si ha iniciado sesión, y si no lo redirecciona a la página de inicio de sesión. La página de inicio de sesión encontrará su proveedor personalizado porque eso es lo que está configurado en el web.config y registrará su usuario en Puede acceder a información sobre el usuario conectado a los controladores haciendo referencia al usuario objeto:.

public class WhateverController : Controller 
{ 
    [Authorize] 
    public ActionResult WhateverAction() 
    { 
     ViewData["LoggedInAs"] = string.Format("You are logged in as {0}.", User.Identity.Name); 
     Return View(); 
    } 
} 

Por lo tanto, esta acción requiere que el usuario inicie sesión y presente la información del usuario en la vista Whatever/WhateverAction.aspx que se mostrará en la página.

+0

Bien, eso tiene sentido, gracias por aclarar eso. Simplemente no estaba poniendo dos y dos juntos. Todavía estoy atrapado en ese estado de ánimo de WebForms y no me he dado cuenta cuando MVC lo hace por mí y cuando tengo que manejarlo por mí mismo. – BobTheBuilder

0

¿Cuánto cambiaste en esta membresía personalizada? ¿Cómo cambiaste los nombres de las tablas? ¿Puedes registrar usuarios y esas cosas? Es decir, ¿está funcionando su membresía personalizada?

Si cambiaste muchas cosas como si hubieras cambiado el nombre de la tabla de roles a algo diferente o algo así, entonces tendrás que anular la etiqueta Authroize.

Sin embargo, si su membresía personalizada no funciona, probablemente no la haya configurado correctamente y la configuración sea la misma que en los formularios web. Solo tienes que configurar tu webconfig.

</authentication> 
    <membership> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
      requiresQuestionAndAnswer="false" 
      requiresUniqueEmail="true" 
      passwordFormat="Hashed" 
      maxInvalidPasswordAttempts="10" 
      minRequiredPasswordLength="6" 
      minRequiredNonalphanumericCharacters="0" 
      passwordAttemptWindow="10" 
      passwordStrengthRegularExpression="" 
      applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear /> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" applicationName="/" /> 
     </providers> 
    </profile> 
    <roleManager enabled="true"> 
     <providers> 
     <clear /> 
     <add connectionStringName="ConnectionString" 
      applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     <add applicationName="/" name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
     </providers> 
    </roleManager> 
+0

Cuando dices "no cambiamos nada, no cambiamos nada, estamos usando una base de datos de usuarios existente, no la que el asistente ASP.NET MVC establece para ti .. .y para ser honesto, no tenemos la intención de usar el tutorial, es mucho más complejo de lo necesario para nuestras necesidades y no cumple con las necesidades de nuestro modelo comercial. Así que hemos escrito un proveedor de membresía ... lo que no tengo ni idea es cómo engancha mi proveedor personalizado que he especificado en el archivo web.config en la base de código de mi aplicación web? – BobTheBuilder

+0

Bueno, todo lo que te di es lo que usas para configurar una base de datos personalizada con un proveedor personalizado. ¿Podría enumerar las tablas que usa como si estuviera usando aspnet_UserInRoles? aspnet_user y cualquier tabla que tenga el prefijo aspnet? – chobo2

1

Mi proveedor de suscripciones personalizado se hace referencia en el web.config:

<membership defaultProvider="MyMembershipProvider"> 
    <providers> 
    <clear/> 
    <add name="MyMembershipProvider" type="Namespace.MyMembershipProvider, Namespace" connectionStringName="connstring" [...] /> 
    </providers> 
</membership> 

Entonces sólo tiene que utilizar la clase de miembro estático.

+0

Cool: ¿qué impide que especifiques múltiples en el archivo web.config, y cómo en qué parte de mi aplicación web los pone en acción? – BobTheBuilder

+0

En realidad, puede especificar varios proveedores de membresía. Esa es la razón por la que debe especificar el proveedor predeterminado. Siento que la utilidad de múltiples proveedores solo se ve en mecanismos complejos de autorización. Pero para obtener una lista de los proveedores en el código, simplemente use la propiedad System.Web.Security.Membership.Providers que devuelve una colección de proveedores de membresía especificada en web.cofig. – zowens

+0

como escribió zowens. En realidad, puede instanciar su propio proveedor conocido solo de manera normal MembershipProvider mp = new MyMembershipProvider(); o obteniéndolo de la lista devuelto por Membership.Providers – twk

Cuestiones relacionadas