2009-08-19 11 views
35

Używam dotnetopenauth 3.2 do wdrożenia Openid i nie mogę wymyślić, jak skłonić Google do przekazania adresu e-mail w odpowiedzi na roszczenia. Wiem, że Google nie obsługuje prostej rejestracji, ale nie mogę określić, co ona obsługuje.OpenID: próba uzyskania adresu e-mail z Google OP

Nie zgadzam się z tym pytaniem, że właśnie zacząłem uczyć się OpenID i wiem, że nie mam solidnego zrozumienia specyfikacji, co moim zdaniem prowadzi do mojego zamieszania.

Każda pomoc zostanie doceniona!

Odpowiedz

52

Ok to wymyśliłem. Wysłałem pytanie na Goolge's Federated Log API group i powiedziano mi, aby użyć Attribute exchange.

Poniżej znajduje się kod dla DotNetOpenAuth.

Proszę nie używać tego kodu w produkcji. Jest to wyłącznie w celach ilustracyjnych!

zgłoszeniu:

using (OpenIdRelyingParty openid = new OpenIdRelyingParty()) 
{ 
    IAuthenticationRequest request = openid.CreateRequest(openidurl); 

    var fetch = new FetchRequest(); 
    fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
    request.AddExtension(fetch); 

    // Send your visitor to their Provider for authentication. 
    request.RedirectToProvider(); 
} 

Odpowiedzi:

OpenIdRelyingParty openid = new OpenIdRelyingParty(); 
var response = openid.GetResponse(); 
if (response != null) 
{ 
    switch (response.Status) 
    { 
     case AuthenticationStatus.Authenticated: 
     { 
      var fetch = response.GetExtension<FetchResponse>(); 
      string email = string.Empty(); 
      if (fetch != null) 
      { 
       email = fetch.GetAttributeValue(
        WellKnownAttributes.Contact.Email); 
      } 

      FormsAuthentication.RedirectFromLoginPage(
       response.ClaimedIdentifier, false); 
      break; 
     } 
     ... 
    } 
} 
+0

to jest super. Czy przypadkiem nie wiesz, jak uzyskać nazwę dostawcy (poza analizą odpowiedzi)? –

+0

Czy masz na myśli zgłoszony identyfikator? case AuthenticationStatus.Authenticated: { Identyfikator łańcucha = odpowiedź.ClaimedIdentifier; } – Rob

+0

Myślę, że mówił o prawdziwej przyjaznej nazwie dostawcy, tj .: "Google" "Facebook" bez wysyłania odpowiedzi. – Brian

1

Kiedy próbuję uzyskać pełną nazwę odpowiedź jest null, proszę podać rozwiązanie, aby uzyskać pełną nazwę, ten poczta jest naprawdę pomocna Dziękuję. Mój przykładowy kod w ten sposób.

var fetch = new FetchRequest(); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName); 
      fetch.Attributes.AddRequired(WellKnownAttributes.Company.CompanyName); 
      //fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 

      request.AddExtension(fetch); 

I

if (fetch != null) 
     { 
      email = fetch.GetAttributeValue(WellKnownAttributes.Contact.Email); 
      name = fetch.GetAttributeValue(WellKnownAttributes.Name.FullName); 
      company = fetch.GetAttributeValue(WellKnownAttributes.Company.CompanyName); 
     } 
Powiązane problemy