2009-07-27 9 views
5

J'utilise le code suivant de MVC Storefront pour tester OpenId dans MVC. Comment puis-je l'intégrer à mon abonnement ASP.Net pour pouvoir utiliser des rôles et enregistrer un nom d'utilisateur pour l'utilisateur dans mes tables? Je crois que SO utilise aussi quelque chose de similaire.Comment intégrer OpenId avec l'adhésion ASP.Net dans 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"); 
     } 
    } 

Répondre

6

Il existe déjà plusieurs questions comme la vôtre sur StackOverflow. This one semble particulièrement similaire.

Si vous utilisez déjà le fournisseur d'adhésion pour votre site et que vous y ajoutez juste OpenID, alors je suppose que vous êtes coincé avec l'adhésion pour l'instant et pouvez utiliser l'une des réponses à la question à laquelle je suis lié pour obtenir un fournisseur d'adhésion semi-décent qui PEUT travailler pour vous.

Mais si vous écrivez un nouveau site et que vous voulez juste "utiliser des rôles et enregistrer un nom d'utilisateur pour l'utilisateur dans mes tables", comme vous l'avez dit, N'utilisez PAS du tout l'adhésion ASP.NET. Ce n'est donc pas la peine! Il ne correspond pas au paradigme sans mot de passe d'OpenID et cause juste plus de chagrin qu'autre chose. Si vous n'avez pas peur d'un peu d'accès à la base de données, faites-le de cette façon. Et vous pouvez obtenir le comportement Rôles très simplement en émettant votre propre appel FormsAuthentication.RedirectFromLoginPage ou FormsAuthentication.SetAuthCookie et en passant dans les rôles que l'utilisateur remplit.

+0

Je suis en train de jouer avec une nouvelle implémentation, donc, je ne suis pas particulièrement marié à l'adhésion à ASP.NET. Pouvez-vous suggérer avec un exemple de code comment le faire comme vous l'avez mentionné? – Picflight

+0

Je vais laisser un "moi aussi" ici pour l'exemple de code. En connaissez-vous? –

+0

Tous les échantillons et les modèles de projet livrés avec DotNetOpenAuth le font comme je l'ai mentionné. –

1

Le fournisseur d'ID ouvert renvoie des données sur l'utilisateur. Si vous ne demandez pas/n'exigez pas de jetons d'informations spécifiques, tout ce qui vous sera communiqué est le nom d'utilisateur et l'URL d'identité de l'utilisateur. Selon la bibliothèque d'ID ouverte que vous utilisez, vous pouvez demander des jetons comme FirstName LastName, DOB (si vous vous en souciez vraiment) et si l'utilisateur a fourni cette information sur l'identité de votre choix, vous l'obtiendrez toi.

Vous pouvez ensuite utiliser ceci pour créer un nouvel utilisateur dans le système d'appartenance. Vous devrez probablement leur donner un mot de passe fictif pour contourner les exigences de l'API Membership.

Pour valider un login, fournissez un formulaire qui prend le nom d'utilisateur & password et l'autre qui prend une URL d'identité. Après avoir validé l'utilisateur via l'ID ouvert, essayez de trouver l'utilisateur par nom d'utilisateur (URL d'identité) dans l'API Membership. Si ce n'est pas le cas, créez-le.

Questions connexes