2009-05-27 15 views
13

Existen varias formas de utilizar OpenID en sitios ASP.net, pero ninguna de ellas parece utilizar el mecanismo existente de Membresía y Proveedores de Autenticación.Implementación de OpenID en ASP.net "Correctamente" - ¿Membresía o proveedor de autenticación?

Me pregunto cuál sería la forma correcta de crear un sitio que dependa únicamente de OpenID? ¿Continuar utilizando Autenticación de formularios pero implementando una variante de SqlMembershipProvider que hace la búsqueda contra OpenID?

¿O podría ir un nivel más profundo y escribir mi propio FormsAuthenticationModule? Eso parece ser un poco escueto, ya que (según mi conocimiento) la Autenticación de Formularios puede buscarse contra cualquier fuente de datos.

¿O hay una tercera vía, manteniendo el FormsAuthenticationModule pero haciéndolo hacer la búsqueda contra OpenID?

Como esto es para una aplicación MVC de ASP.net, no me sirven para los controles integrados de inicio de sesión de WebForms si eso hace la diferencia.

Respuesta

10

La API de membresía que define ASP.NET no encaja en absoluto con OpenID, que es probablemente la razón por la que no ve muchos sistemas que lo usan. Aún no he visto la necesidad de utilizar el proveedor de Membresía con OpenID, por lo que realmente no se ha convertido en un problema. Un proyecto que intentó hacer que el modelo de proveedor de Membresía encajara con OpenID es http://code.google.com/p/dotnet-membership-provider/, pero no parece que se haya mantenido recientemente.

Como dijo womp, no necesita volver a hacer el FormsAuthenticationModule. Funciona perfectamente bien con OpenID.

Consulte el project templates que viene con DotNetOpenAuth para ver cómo funcionan las cosas sin el proveedor de membresía.

+0

Vote para obtener una mejor interfaz de proveedor de membresía que funcione con OpenID: http://aspnet.uservoice.com/forums/41199-general/suggestions/486926-new-membership-provider-interface-supporting-redir –

0

muestra La ASP.NET MVC incluye con DotNetOpenId utiliza FormsAuthentication para iniciar la sesión del usuario en después de que hayan sido autenticados por OpenID. Por lo que puedo decir, no hace ninguna integración con el sistema de Membresía.

4

El proyecto OpenID Membership Provider podría ser lo que estás buscando.

Y aunque no esté utilizando los controles de inicio de sesión, se recomienda aprovechar el modelo de proveedor de membresía para la autenticación.

Generalmente no es necesario ir tan lejos como la implementación de la funcionalidad específica de FormsAuthentication, ya que escribir MembershipProvider es bastante trivial, y nunca he encontrado un caso en el que no fuera lo suficientemente flexible como para manejarlo. Tenga en cuenta que a menudo solo necesita implementar un método (ValidateUser()) de la interfaz para obtener un proveedor que funcione.

+4

Tenga en cuenta que este proyecto utiliza una * muy * antigua versión de una biblioteca OpenID y no es recomendable su uso sin actualizar a la última versión (que es DotNetOpenAuth disponible en http://dotnetopenid.googlecode.com/) –

0

si alguien encuentra un buen ejemplo de C# janrain - por favor, hágamelo saber.

tengo dsn apuntando a tumblr, luego para el widget de inicio de sesión vuelve a un subdominio donde tengo su ruta a una carpeta debajo de la raíz.

entonces tengo una carpeta app_code allí estoy usando esta clase de ayuda C# - puedo recuperar el token y me lleva a members.domain.com para que el widget esté funcionando - solo necesito obtener los detalles del usuario sobre el proveedor que utilizaron para llegar al área de miembros.

http://groups.google.com/group/rpx-developers/web/c-helper-class?_done=/group/rpx-developers%3F

es la clase de ayuda

error

Error de servidor en la aplicación '/'. Error de API inesperado Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Exception: API error inesperado

Error de origen:

Línea 22: Línea 23 : Rpx feedit = new Rpx ("apikey", "https://learnbartending.rpxnow.com/"); Línea 24: feedit.AuthInfo (justoken); Línea 25: XmlElement xmlstuff = feedit.AuthInfo (justoken); Línea 26:

Archivo de origen: C: \ Inetpub \ vhosts \ learnbartending.com \ httpdocs \ \ miembros Default.aspx.cs Línea: 24

Seguimiento de la pila:

0

Si es necesario aprovechar la userID(guid) de su base de datos de afiliación, entonces van a tener que crear una cuenta de esqueleto cuando por vez primera entrada, TH es descifrar algún mecanismo de rotación de una nueva contraseña en los inicios de sesión posteriores. Esta contraseña obviamente sería para su proveedor de Membresía y sería transparente.

¿Ahora la parte divertida es encontrar metadatos que es común? HMM dirección de correo electrónico tal vez?

Estoy trabajando en este dilema también con facebook connect. Tengo que tener un ID de usuario para vincularlos a las publicaciones clasificadas en mi base de datos.

Cosas divertidas.

Solo una actualización. Tengo esto funcionando bien.

creé una mesa

CREATE TABLE [dbo].[OAuthUsers] 
(
    [OuthUserID] [int] IDENTITY(1,1) NOT NULL, 
    [UserID] [uniqueidentifier] NOT NULL, 
    [access_token] [varchar](150) NULL, 
    [expires_in] [datetime2](7) NULL, 
    [refresh_token] [varchar](150) NULL, 
    [issued_at] [datetime2](7) NULL, 
    [user_id] [varchar](50) NOT NULL, 
    [domain] [varchar](50) NULL, 
    [scope] [varchar](150) NULL, 
    CONSTRAINT [PK_OAuthUsers] PRIMARY KEY CLUSTERED 
) 

tienda del access_token de facebook o OpenID. OpenID tiene un token de actualización que puede solicitar, así que guárdelo también

Tengo un manejador de ashx como mi redirect_url. En ese controlador, puede hacer todo el procesamiento para cada caso, el usuario ya tiene una cuenta en la base de datos del proveedor, el usuario no tiene una cuenta en la base de datos del proveedor, así que creamos una. Toda esa buena mierda :)

Diviértete con ella.

2

Esta es una vieja pregunta, pero no he visto el enfoque que utilicé al buscarla, así que aquí va. (Solo se ha probado con Google, ya que estoy creando la apariencia de integración con la cuenta de Google Apps for Business de mi empresa, en lugar de la integración completa de OpenID.)

Uso DotNetOpenAuth para solicitar el OpenID, asegurándome de requerir la dirección de correo electrónico.

 request.AddExtension(new ClaimsRequest 
     { 
      BirthDate = DemandLevel.NoRequest, 
      Email = DemandLevel.Require, 
      FullName = DemandLevel.Require 
     }); 

Entonces, cuando regrese una respuesta autenticado, miro hacia arriba el nombre de usuario del correo electrónico:

  case AuthenticationStatus.Authenticated: 
       ClaimsResponse info = response.GetExtension<ClaimsResponse>(); 
       string username = Membership.GetUserNameByEmail(info.Email); 
       FormsAuthentication.SetAuthCookie(username, true); 
       return Redirect(ReturnUrl ?? "/"); 

Asumiendo que también tiene un proveedor de pertenencia y el papel configurado, el establecimiento de las formas La cookie de autenticación para el nombre de usuario apropiado le da acceso a todas las bondades de Membresía y Roles.

+0

¿Cómo lidiar con el ahorro de la base de datos de miembros? –

+0

¿Guardar, como en, crear nuevas cuentas? – Dave

+1

Sí, ¿cómo manejas las contraseñas? –

Cuestiones relacionadas