2009-08-19 9 views
35

Openid'i uygulamak için dotnetopenauth 3.2 kullanıyorum ve Google'ın, Talep Yanıtı'ndaki e-posta adresini iletmesini nasıl sağlayabileceğimi anlayamıyorum. Google’ın basit kaydı desteklemediğini biliyorum, ancak desteklediklerini belirleyemiyorum.OpenID: Google OP'den E-posta Adresi Almaya Çalışıyor

Bu soruna dikkat etmem, OpenID'yi yeni öğrenmeye başladım ve biliyorum ki, karışıklıklara yol açtığını düşündüğüm spesifikasyon hakkında sağlam bir kavrayışım yok.

Herhangi bir yardım için teşekkür ederiz!

cevap

52

Tamam, anladım. Goolge's Federated Log API group'da bir soru yayınladım ve Attribute exchange'u kullanması söylendi.

DotNetOpenAuth için kod aşağıdadır.

Lütfen bu kodu üretimde kullanmayın. Bu sadece örnekleme amaçlıdır!

İstek:

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(); 
} 

Yanıt: Ben cevap null Tam Adı almaya çalıştığınızda, Tam adını almak için bir çözüm sağlamak lütfen

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

bu harika. Sağlayıcı adının nasıl alınacağını da biliyor musunuz (yanıtı analiz etmenin yanı sıra)? –

+0

Talep edilen ID'yi mi kastediyorsunuz? case AuthenticationStatus.Authenticated: { string identifier = response.ClaimedIdentifier; } – Rob

+0

Sanırım sağlayıcının asıl dostu adı hakkında konuşuyordu: "Google" "Facebook" w/yanıtı ayrıştırmak zorunda kaldı. – Brian

1

, Bu Gönderi gerçekten yardımcı olur Teşekkür ederiz. Örnek kodum şunun gibi.

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); 

Ve

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