2009-08-19 3 views
35

OpenID를 구현하기 위해 dotnetopenauth 3.2를 사용 중이며 Google이 클레임 응답에서 이메일 주소를 전달하는 방법을 알 수 없습니다. Google은 간단한 등록을 지원하지 않지만 지원 대상을 결정할 수는 없습니다.OpenID : Google OP에서 이메일 주소를 가져 오려고 시도했습니다.

이 질문에 대한 경고는 방금 OpenID를 배우기 시작한 것이므로 혼란 스러울 것으로 생각되는 사양에 대한 확실한 이해가 없다는 것입니다.

도움이 될 것입니다.

답변

52

알아 냈습니다. Goolge's Federated Log API group에 질문을 올렸으며 Attribute exchange을 사용하라고 들었습니다.

아래 코드는 DotNetOpenAuth의 코드입니다.

프로덕션 환경에서이 코드를 사용하지 마십시오. 이것은 단지 설명을위한 것입니다!

요청 :

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

답변서 : 나는 응답이 null의 전체 이름을 얻으려고 할 때, 이름을 얻을 수있는 솔루션을 제공하십시오

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

이 중대하다. 응답을 분석하는 것 이외에도 공급자 이름을 얻는 방법을 알고 있습니까? –

+0

청구 된 ID를 의미합니까? 사례 AuthenticationStatus.Authenticated : { 문자열 식별자 = 응답. 요청 된 식별자; } – Rob

+0

나는 그가 공급자의 실제적인 친숙한 이름에 대해 이야기하고 있었다고 생각한다. 즉, "Google" "Facebook"이 응답을 분석해야한다. – Brian

1

, 이 게시물은 정말 도움이 ful 감사합니다. 내 샘플 코드는 다음과 같습니다.

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

그리고

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