2011-05-02 7 views
7

Tengo un poco de una situación única aquí. Estoy haciendo una aplicación web que tendrá la capacidad de iniciar sesión con diferentes credenciales de aplicaciones web. Por ejemplo, puede iniciar sesión/registrarse en mi sitio o puede iniciar sesión/registrarse con su cuenta de YouTube. No estoy usando OpenID porque necesito tener acceso a los datos de YouTube en este caso.Cambiar los proveedores de membresía ApplicationName durante el tiempo de ejecución. ¿Cómo?

Estoy usando ASP.NET MVC 3 EF4 con membresía personalizada, función, proveedores de perfiles.

El problema es que los nombres de usuario no pueden ser únicos porque alguien con un nombre de usuario de YouTube podría tener el mismo nombre de usuario que alguien que se haya registrado en mi sitio. Así que lo hice especificando un tipo de usuario en mi tabla de usuarios. Esto es más o menos una clave compuesta (identificación de usuario y tipo de usuario).

Tengo un atributo de autorización personalizado que está buscando el rol en el que se encuentra el usuario, pero ahora necesito implementar un IPrincipal personalizado porque necesito pasar un tipo de usuario. El único problema es dónde lo almaceno? ¿La sesión?

Originalmente pensé que esto es lo que la tabla de aplicación era de, y tuve éxito momentáneo con eso, pero no leer enhebrar cuestiones, y que estaba recibiendo faltas de sesión por todo el lugar no era tan bueno :(

Me pregunto cuál es la mejor manera de hacerlo porque no puedo usar los métodos reemplazados en los proveedores porque tengo que agregar un parámetro UserType a algunos de los métodos, pero esto rompe la funcionalidad del proveedor.

EDITAR: Básicamente necesito tener la capacidad de cambiar ApplicationName en el tiempo de ejecución pro-gramáticamente. Intenté hacer esto, el único problema fue cuando me detuve mi servidor de desarrollo, pero dejé mi navegador abierto y luego volví a ejecutar mi servidor de desarrollo; no mantendría el nombre de la aplicación.

EDITAR: He cambiado mi aplicación para usar OAuth, nunca encontré una buena solución.

+0

Muy buena pregunta. Tuve que hacer esto en el pasado y solo a 1/2 me gustó la solución que creé. Le mostraré parte del código cuando le devuelva mi computadora a mi esposa. :) –

Respuesta

-1

Ryan,

Hmmm ... ¿puede trabajar medio en torno al problema anteponiendo la emisión-autoridad (local o YouTube) para el campo nombre de usuario en sí ... Ejemplo de nombres de usuario: "LOCAL/corlettk", " YOUTUBE/corlettk "???

Ok, necesitarás un Autenticador personalizado para dividir la cadena compleja, y pasar rápidamente la solicitud de inicio de sesión al Autenticador subyacente apropiado ... pero una vez hecho esto, (supongo) que eres todo listo para lidiar FÁCILMENTE con el problema mucho más grande (desde su perspectiva) de la Autorización.

Me percibe que usted es un tipo inteligente ... ¿ha considerado y descartado este enfoque?

Saludos. Keith.

PD: Sí, soy un hacker ... pero tengo la mala costumbre de piratear cosas que FUNCIONAN ... así que se han rendido tratando de educarme.

+0

Sí, ya he pensado en esto, sin embargo, ¿qué ocurre si necesito tener páginas basadas en el tipo de usuario, ahora debo verificar el campo de nombre de usuario y dividir la cadena? – Ryan

+0

Hmmmm ... 'if (username.StartsWith (" LOCAL/")' no se parece a demasiadooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo factoréelo en su árbol de herencia. 'LocalUser extends User' y' YouTubeUser extends User' de modo que esta pequeña decisión se tome una vez por sesión. (Sí, soy Java). – corlettk

+0

En su defecto ... Mate, usted casi listo en su ruta actual. Necesitará una implementación personalizada de 'IPrinciple.IsInRole' que use' IDomainIdentity extends IIdentity' ... Y sí, supongo 'Credentials' us" un atributo natural "de la sesión. me parece "correcto" (pero lo sé todo sobre MVC3). Me interesará saber lo que los expertos REAL tienen que decir. – corlettk

5

básicamente tengo que tener la capacidad de cambiar el ApplicationName en tiempo de ejecución pro-gramatical. Probé haciendo esto, el único problema fue cuando detuve mi servidor de desarrollo pero dejé mi navegador abierto y luego ejecuté mi servidor dev de nuevo, no mantendría el nombre de la aplicación .

Si necesita cambiar el Nombre de la aplicación, esto significa que debe seleccionar un proveedor en el tiempo de ejecución. La única forma de hacerlo es NO usar la "Membresía" singleton, ya que usa el proveedor definido en web.config.

lugar cada vez que necesite para el uso por proveedor:

MembershipProvider userProvider = Membership.Providers[UserProviderName]; 

Sólo hay que establecer UserProviderName la manera deseada. Me gustaría ir con un filtro personalizado de autorización global o preAcción que detecta el proveedor de alguna cookie u otra variable de sesión y pone al proveedor en la colección HttpContextBase.Items que vive para una y solo una solicitud.

+0

Me gusta esta solución. Esto permite que cada "autoridad" se configure ligeramente diferente (por ejemplo, tiempo de espera diferente) si es necesario. ¡Gran idea! –

+0

El único inconveniente de esta solución es que la clase de Membresía ofrece algunos métodos estáticos muy útiles que MembershipProvider no ofrece. Toda la funcionalidad está ahí, es solo que la Membresía es algo más fácil de usar. –

+0

Tiene razón, el proveedor de base es muy básico. Su aplicación está en el 5% no soportada correctamente por el marco. – Softlion

Cuestiones relacionadas