2009-07-27 13 views
5

Korzystam z następującego kodu z MVC Storefront do testowania OpenId w MVC. Jak mogę zintegrować to z moim członkostwem ASP.Net, aby móc używać ról i zapisywać nazwę użytkownika dla moich tabel? Wierzę, że SO używa również czegoś podobnego.Jak zintegrować OpenId z członkostwem ASP.Net w 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"); 
     } 
    } 

Odpowiedz

6

W StackOverflow istnieje kilka podobnych pytań. This one wydaje się szczególnie podobny.

Jeśli korzystasz już z usługodawcy na rzecz członkostwa i właśnie dodajesz do niego OpenID, to na razie utknąłeś w członkostwie i możesz użyć jednej z odpowiedzi na pytanie, które przyzwoity dostawca członkostwa, który MOŻE pracować dla Ciebie.

Ale jeśli piszesz nową witrynę i chcesz tylko "używać ról i zapisz nazwę użytkownika w moich tabelach", tak jak powiedziałeś, NIE używaj członkostwa ASP.NET w ogóle. To nie jest tego warte! To nie pasuje do bezautentycznego paradygmatu OpenID i powoduje więcej smutku niż cokolwiek innego. Jeśli nie boisz się dostępu do bazy danych samemu, zrób to w ten sposób. Zachowanie ról można bardzo łatwo uzyskać, wydając własne wywołanie FormsAuthentication.RedirectFromLoginPage lub FormsAuthentication.SetAuthCookie i przekazując role, które wypełnia użytkownik.

+0

Gram z nową implementacją, więc nie jestem szczególnie żonaty z członkostwem ASP.NET. Czy możesz zasugerować za pomocą przykładowego kodu, jak to zrobić, o czym wspomniałeś? – Picflight

+0

Zostawię tutaj "mnie też" dla przykładowego kodu. Czy znasz jakieś? –

+0

Wszystkie próbki i szablony projektów dostarczane z DotNetOpenAuth robią to w sposób, o którym wspomniałem. –

1

Dostawca otwartego identyfikatora zwróci dane o użytkowniku. Jeśli nie zażądasz/nie zażądasz określonych tokenów informacji, wtedy wszystko, co otrzymasz, to wyświetlana nazwa użytkownika i adres URL tożsamości.

W zależności od używanej biblioteki otwartych identyfikatorów, możesz zażądać takich tokenów, jak FirstName LastName, DOB (jeśli naprawdę troszczysz się) i jeśli użytkownik poda te informacje na temat wybranej przez siebie tożsamości, to wróci do ty.

Możesz użyć tego do utworzenia nowego użytkownika w systemie członkowskim. Prawdopodobnie będziesz musiał podać im fałszywe hasło, aby ominąć wymagania interfejsu API programu Membership.

Aby zatwierdzić login, podaj 1 formularz, który przyjmuje nazwę użytkownika & hasło, a drugi, który ma adres URL tożsamości. Po sprawdzeniu użytkownika za pomocą otwartego identyfikatora spróbuj znaleźć użytkownika według nazwy użytkownika (adresu URL tożsamości) w interfejsie API usługi Membership. Jeśli nie istnieje, utwórz go.

Powiązane problemy