2009-07-27 19 views
5

Estoy usando el siguiente código de MVC Storefront para probar OpenId en MVC. ¿Cómo lo integro con mi membresía ASP.Net para que pueda usar roles y guardar un nombre de usuario para el usuario en mis tablas? Creo que SO también está usando algo similar.Cómo integrar OpenId con membresía ASP.Net en MVC

public ActionResult OpenIdLogin() 
    { 
     string returnUrl = VirtualPathUtility.ToAbsolute("~/"); 
     var openid = new OpenIdRelyingParty(); 
     var response = openid.GetResponse(); 
     if (response == null) 
     { 
      // Stage 2: user submitting Identifier 
      Identifier id; 
      if (Identifier.TryParse(Request["openid_identifier"], out id)) 
      { 
       try 
       { 
        IAuthenticationRequest req = openid.CreateRequest(Request["openid_identifier"]); 

        var fetch = new FetchRequest(); 
        //ask for more info - the email address 
        var item = new AttributeRequest(WellKnownAttributes.Contact.Email); 
        item.IsRequired = true; 
        fetch.Attributes.Add(item); 
        req.AddExtension(fetch); 

        return req.RedirectingResponse.AsActionResult(); 
       } 
       catch (ProtocolException ex) 
       { 
        ViewData["Message"] = ex.Message; 
        return View("Logon"); 
       } 
      } 
      else 
      { 
       ViewData["Message"] = "Invalid identifier"; 
       return View("Logon"); 
      } 
     } 
     else 
     { 
      // Stage 3: OpenID Provider sending assertion response 
      switch (response.Status) 
      { 
       case AuthenticationStatus.Authenticated: 

        var fetch = response.GetExtension<FetchResponse>(); 
        string name = response.FriendlyIdentifierForDisplay; 
        if (fetch != null) 
        { 
         IList<string> emailAddresses = fetch.Attributes[WellKnownAttributes.Contact.Email].Values; 
         string email = emailAddresses.Count > 0 ? emailAddresses[0] : null; 
         //don't show the email - it's creepy. Just use the name of the email 
         name = email.Substring(0, email.IndexOf('@')); 
        } 
        else 
        { 

         name = name.Substring(0, name.IndexOf('.')); 
        } 

        //FormsAuthentication.SetAuthCookie(name, false); 
        SetCookies(name, name); 
        AuthAndRedirect(name, name); 

        if (!string.IsNullOrEmpty(returnUrl)) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       case AuthenticationStatus.Canceled: 
        ViewData["Message"] = "Canceled at provider"; 
        return View("Logon"); 
       case AuthenticationStatus.Failed: 
        ViewData["Message"] = response.Exception.Message; 
        return View("Logon"); 
      } 
     } 
     return new EmptyResult(); 

    } 

    ActionResult AuthAndRedirect(string userName, string friendlyName) 
    { 
     string returnUrl = Request["ReturnUrl"]; 
     SetCookies(userName, friendlyName); 

     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
      return Redirect(returnUrl); 
     } 
     else 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
    } 

Respuesta

6

Ya hay varias preguntas como la suya en StackOverflow. This one parece particularmente similar.

Si ya está utilizando el proveedor de pertenencia para su sitio y se acaba de añadir OpenID a ella, entonces supongo que está pegado con membresía por el momento y puede utilizar una de las respuestas a la pregunta que he vinculado a conseguir un proveedor de membresía semi-decente que PUEDE funcionar para usted.

Pero si está escribiendo un nuevo sitio y solo quiere "usar roles y guardar un nombre de usuario para el usuario en mis tablas" como dijo, entonces NO use la membresía ASP.NET en absoluto. ¡Así que no vale la pena! No se ajusta al paradigma de contraseña de OpenID y simplemente causa más dolor que cualquier otra cosa. Si no le teme a un poco de acceso a la base de datos, hágalo de esa manera. Y puede obtener el comportamiento de Roles muy fácilmente con solo emitir su propia llamada FormsAuthentication.RedirectFromLoginPage o FormsAuthentication.SetAuthCookie y pasar los roles que llena el usuario.

+0

Estoy jugando con una nueva implementación, así que no estoy particularmente casado con la membresía de ASP.NET. ¿Puede sugerir con código de muestra cómo hacerlo de la manera que ha mencionado? – Picflight

+0

Voy a dejar un "yo también" aquí para el código de muestra. ¿Sabes de alguno? –

+0

Todas las muestras y plantillas de proyectos que se envían con DotNetOpenAuth lo hacen de la manera que mencioné. –

1

El proveedor de Identificación abierta devolverá datos sobre el usuario. Si no solicita/no requiere fichas de información específicas, todo lo que recibirá será el nombre para mostrar y la URL de identidad del usuario.

Dependiendo de la biblioteca de identificación abierta que esté utilizando, puede solicitar tokens como FirstName LastName, DOB (si realmente le importa) y si el usuario proporcionó esa información en su identidad elegida, entonces la devolvería a tú.

Puede usar esto para crear un nuevo usuario en el sistema de membresía. Probablemente tengas que darles una contraseña ficticia para evitar los requisitos de la API de membresía.

Para validar un inicio de sesión, proporcione 1 formulario que tenga el nombre de usuario & contraseña y el otro que tome una URL de identidad. Después de haber validado al usuario a través de una identificación abierta, intente encontrar al usuario por nombre de usuario (url de identidad) en la API de Membresía. Si no existe, créelo.

Cuestiones relacionadas