2013-03-26 2 views
1

DotNetOpenAuth를 사용하여 Google에서 OpenID를 통해 사용자의 이메일 주소를 검색하려고합니다.Google OpenID를 사용하여 사용자 이메일 주소 얻기

내 코드는 현재 사용자에게 Google로 올바르게 리디렉션되고 내 애플리케이션에서 이메일 주소를 읽을 수있는 권한을 요청합니다. 그러나 다시 내 페이지로 전환되면서 곧바로 Google로 반송됩니다. 페이지가 다시 게시 상태로 들어 가지 않기 때문에 왜 이런 일이 발생하는지 알 수 있습니다. 그러나 요청 및 응답 데이터를 어떻게 구별하여 페이지의 이메일 주소를 올바르게 읽을 수 있습니까?

권장/업계 표준 접근 방식이 있습니까?

나는 단지 오픈 ID 및 DotNetOpenAuth 함께 시작하지만 분명 답을 보관하십시오, 강력한 ASP.NET 기술을 가지고있어

(!)

감사

대신을 IsPostBack을 확인하는
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    ltl.Text = "Welcome " & User.Identity.Name 

    If Not Page.IsPostBack Then 
     Dim openid As New OpenIdRelyingParty 
     Dim req As IAuthenticationRequest = openid.CreateRequest(User.Identity.Name) 
     Dim fetch As New FetchRequest 
     fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email) 
     fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName) 
     req.AddExtension(fetch) 
     req.RedirectToProvider() 
    Else 
     Dim openid As New OpenIdRelyingParty 
     Dim resp As IAuthenticationResponse = openid.GetResponse() 
     If resp IsNot Nothing Then 
      Dim fetch As FetchResponse = resp.GetExtension(Of FetchResponse)() 
      If fetch IsNot Nothing Then 
       Trace.Warn(fetch.GetAttributeValue(WellKnownAttributes.Contact.Email)) 
      Else 
       Trace.Warn("fetch was Nothing") 
      End If 
     Else 
      Trace.Warn("resp was Nothing") 
     End If 
    End If 
End Sub 

답변

3

DotNetOpenAuth 샘플 available on SourceForge을 찾았습니까? 그것에 대해

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    ltl.Text = "Welcome " & User.Identity.Name 

    Dim openid As New OpenIdRelyingParty 
    Dim resp As IAuthenticationResponse = openid.GetResponse() 
    If resp Is Nothing Then 
     Dim req As IAuthenticationRequest = openid.CreateRequest(User.Identity.Name) 
     Dim fetch As New FetchRequest 
     fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email) 
     fetch.Attributes.AddRequired(WellKnownAttributes.Name.FullName) 
     req.AddExtension(fetch) 
     req.RedirectToProvider() 
    Else 
     Dim fetch As FetchResponse = resp.GetExtension(Of FetchResponse)() 
     If fetch IsNot Nothing Then 
      Trace.Warn(fetch.GetAttributeValue(WellKnownAttributes.Contact.Email)) 
     Else 
      Trace.Warn("fetch was Nothing") 
     End If 
    End If 
End Sub 
+0

맞습니다. 나는 대답이 주어 졌는지를 확인하는 것만으로는 생각하지 않았다는 것에 실망했다. – gowansg

+0

Andrew에게 문의 해 주셔서 감사합니다. 코드 샘플을 인식하지 못했습니다. 위의 코드 샘플과 같이 간결한 코드는 매우 유용합니다. 나는 어제 이것을 실제로 풀었지만, 당신의 예를 보았을 때 나는 여전히 개선의 여지가있다. 또 다른 메모에서 어제 코드 샘플을 찾기 위해 웹을 트롤링하는 동안 여러 사이트에서 많은 게시물을 읽었습니다. 이 분야에 대한 귀하의 지속적인 노력과 기여에 감사드립니다. 나 같은 개발자가 인생을 훨씬 쉽게 만들어줍니다 :-) – EvilDr

1

쿼리 문자열 매개 변수를 추가하고 해당 쿼리의 존재 여부를 확인할 수 있습니다. 사용자가 로그인을 요청하거나 공급자가 반송 할 때이 작업을 수행 할 수 있습니다.

아래의 스 니펫은 공급자가 페이지로 다시 리디렉션되었음을 나타내는 쿼리 문자열 매개 변수가 있는지 확인합니다.

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    ltl.Text = "Welcome " & User.Identity.Name 

    If Not Request.QueryString(your_parameter) Is Nothing Then 
     'Read Response 
     ... 
    Else 
     'Send Request 
     Dim openid As New OpenIdRelyingParty 
     Dim req As IAuthenticationRequest = openid.CreateRequest(User.Identity.Name) 

     'Specify the url the provider should redirect to 
     'this would be whatever url brings you to this page plus query string 
     req.AddCallbackArguments("returnUrl", your_url); 
     ... 
    End If 
End Sub 
+0

안녕 네 감사 : 여기

권장되는 패턴이다. 그것이 내 생각 이었지만, DotNetOpenAuth를 사용하여 업계 표준 접근 방식이 있는지 알고 싶습니다 ...? – EvilDr

+1

인공 콜백 매개 변수가 필요하지 않습니다. –