Pregunta

Después de todas las respuestas a mi última pregunta sobre el ajuste fino resultó ser más útil de lo que esperaba, pensé que iba a hacer otra pregunta similar sobre los MembershipProviders también.

De acuerdo, así que en primer lugar, para aclarar: Yo sé lo que es una membresía, Papel, y el proveedor de perfil es, cómo poner en práctica mi cuenta, y cómo configurarlos, y la mayoría de las cosas acerca de ellos
. La implementación de una función y proveedor de perfil es bastante sencillo, ya que sólo requieren CRUD sencilla la mayor parte del tiempo. (A sola línea de LINQ es suficiente para aproximadamente la mitad de los métodos de la RoleProvider.)

Sin embargo, el proveedor de pertenencia es una bestia diferendo. Muchos de ustedes pueden darse cuenta de que viola el principio de SR (Responsabilidad Individual), debido a que tiene que hacer todo lo relacionado con la gestión de usuarios. Si bien esto deja mucho espacio para las personalizaciones, tiene sus desventajas también. No hay información en Internet acerca de lo que su comportamiento exacto esperado es, por ejemplo, cuando se deben lanzar excepciones o simplemente devolver null, y cosas por el estilo.

este ejemplo de implementación para referencia, pero también contiene varias contradicciones.

  • Por ejemplo, utiliza su propio método ValidateUser para la comprobación de las credenciales en el método ChangePassword. Pero el ValidateUser también actualiza LastLoginDate del usuario a la fecha actual. Por lo tanto, no espere que el marco que lo fijo en mi propio proveedor, así, o es simplemente un error en la muestra?
  • La otra es: el método ChangePassword lanza una excepción cada vez que la hora de validar la nueva contraseña, pero no siempre CreateUser una excepción, simplemente devuelve false
  • .
  • Y por último, pero no menos importante: cuenta los intentos de contraseña no válidos del usuario y las cerraduras si se pasa un umbral. Si bien esto es bueno, pero requiere una acción manual para desbloquear los usuarios. ¿Es un problema si el profesional se desbloquea automáticamente al usuario después de un cierto período de tiempo?

  • (EDIT) se me olvidaba: el método CreateUser en la muestra inserta el ID del parámetro del método. De hecho, creo que esto es una mala práctica, porque el uso de semiproductos con incement automático como identificación, por lo que la inserción de ellos de algún parámetro de método no es una opción. ¿Debo pasar por alto el parámetro, o exigir que su valor es nulo y lanzar una excepción si no lo es?

Con todo, no tiene ningún ASP.NET supuestos sobre el comportamiento de un MembershipProvider?
¿Hay alguna documentación que describe cuándo debería lanzar una excepción o devolución simplemente nula?

También trató de encontrar un conjunto de pruebas unitarias genéricos que proporcionaría alguna orientación sobre el comportamiento esperado, pero no hubo suerte, me encontré con un montón de artículos sobre "Prueba de la unidad es bueno", y "¿Cómo unidad de prueba de un MembershipProvider" , pero no es uno donde no habría ningún pruebas reales.

Gracias de antemano por todo el mundo!

¿Fue útil?

Solución

Puede consultar MSDN para orientación. Por ejemplo, RoleProvider.RemoveUsersFromRoles ofrece la siguiente orientación:

RemoveUsersFromRoles es llamado por RemoveUserFromRole, RemoveUsersFromRole, RemoveUserFromRoles, y RemoveUsersFromRoles métodos de la Los roles de clase para eliminar el especifican usuarios de las funciones especificadas en el fuente de datos. Solamente los roles para el configurado ApplicationName son modificado.

Si alguno de los nombres de roles específicos son que no se encuentra configurado para el applicationName, se recomienda que su proveedor de tiro de ProviderException.

Si alguno de los nombres de usuario especificados son no asociado con ninguna de las nombres de roles especificados para el configurado applicationName, nos recomendar que su proveedor de lanzar una ProviderException.

Si alguno de los nombres de usuario especificados es nula o es una cadena vacía, nos Recomendamos que su proveedor de lanzar una excepción.

Si alguno de los nombres de roles especificados es nula o es una cadena vacía, nos Recomendamos que su proveedor de lanzar una excepción.

Si sus ayudas de la fuente de datos transacciones, le recomendamos que las incluir cada operación de eliminación en una transacción y que deshace la transacción y una excepción si cualquier operación de eliminación falla.

RoleProvider.GetRolesForUser dice:

GetRolesForUser es llamado por el método GetRolesForUser de la clase Roles para recuperar los nombres de función que el usuario especificado está asociado con la fuente de datos. Sólo los roles para el ApplicationName configurado se recuperan.

Si no existen funciones para el usuario especificado para el applicationName configurado, se recomienda que el proveedor devuelva una matriz de cadenas sin elementos.

Si el nombre de usuario especificado es nulo o es una cadena vacía, se recomienda que su proveedor de lanzar una excepción.

Sin embargo, en la práctica, existen muy pocos métodos y comportamientos en cada proveedor que se requiere y se espera. El resto son el apoyo a las características que desea implementar.

Después de varios años de tratar con la pila proveedor predeterminado he llegado a entender algunas de las cosas que están dando una pausa en relación con la muestra se enlaza a, que es una aplicación muy sencilla que corta las esquinas, por ejemplo, en el ChangePassword método.

Si utiliza reflector y examinar SqlMembershipProvider usted notará algunas diferencias notables ...

Por ejemplo:

  • ValidateUser actualizaciones fecha de inicio de sesión porque, bueno, el usuario inicia sesión en y lo hace llamando .CheckPassword con cierto para UpdateLastLoginTime. Cambiar contraseña llama al mismo método pero los suministros falsa.

  • El método CreateUser acepta una ProviderUserKey porque el sproc también aceptará un parámetro UserId. Esto es para permitir la recreación y la sincronización entre las mesas de miembros y usuarios. Como consumidor de la API que normalmente no utilizar esta funcionalidad, pero la pila proveedor realiza internamente.

  • En cuanto bloqueo .. Depende de usted. Eso es lo que la implementación de proveedores personalizados se trata: conseguir el comportamiento que desea. Como ya he dicho, hay muy pocos requisitos sistemáticos.

Por lo tanto, esto nos lleva a la última parte de su pregunta (ambos párrafos aluden a la misma preocupación): comportamiento esperado y las pruebas unitarias ...

Dado que el comportamiento de un proveedor es en gran medida arbitraria y hay pocos comportamientos esperados, un conjunto establecido de pruebas genéricas contendría muy pocos métodos. Es necesario que las pruebas de escritura que se aplican a la conductade su aplicación.

Como nota final, le sugiero que encontrar y < a href = "http://download.microsoft.com/download/a/b/3/ab3c284b-dc9a-473d-b7e3-33bacfcc8e98/ProviderToolkitSamples.msi" rel = "nofollow noreferrer"> descargar la Asp .Net proveedor de muestras toolkit. Que le provee de trabajo código fuente de la pila completa proveedor de SQL y le dará una idea de cómo los proveedores 'reales' aplicación.

Afterthoughts

En este mismo momento, yo estoy poniendo en práctica una pila proveedor de SQLite completo que es 100% compatible con la pila de SQL predeterminado. El conjunto de pruebas verifica la paridad de comportamiento entre mi pila y asp.net de. Si se golpea mi blog a través de mi perfil y contactos me dejaré saber cuando hayan completado las pruebas y se puede utilizar como un punto de referencia en cuanto a lo que se espera exactamente de la pila por defecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top