Получите адрес электронной почты пользователей с помощью Google OpenID

Я пытаюсь получить адрес электронной почты пользователя из Google через OpenID с помощью DotNetOpenAuth.

Мой код до сих пор правильно перенаправляет в Google для текущего пользователя и запрашивает разрешение для моего приложения на чтение адреса электронной почты. Однако, когда его перенаправляют обратно на мою страницу, он возвращается обратно в Google. Я понимаю, почему это происходит (потому что страница никогда не переходит в состояние обратной передачи), но как провести различие между данными запроса и ответа, чтобы я мог правильно прочитать адрес электронной почты на странице?

Есть ли для этого рекомендуемый / отраслевой стандарт?

Я только начинаю работать с OpenID и DotNetOpenAuth, но у меня сильные навыки работы с ASP.NET, поэтому, пожалуйста, держите свои ответы ясными (!)

Спасибо

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

person EvilDr    schedule 26.03.2013    source источник


Ответы (2)


Вы нашли образцы DotNetOpenAuth, доступными на 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
person Andrew Arnott    schedule 27.03.2013
comment
Вы правы. Я разочарован, что не подумал просто проверить, был ли дан ответ. - person gowansg; 27.03.2013
comment
Спасибо за ваш вклад, Эндрю. Я не знал примеров кода, и они будут чрезвычайно полезны, если они будут такими же краткими, как ваш пример кода выше. Вчера я действительно решил это сам, но, увидев ваш пример, у меня все еще есть возможности для улучшения. С другой стороны, вчера, рыская по сети в поисках образцов кода, я прочитал много ваших сообщений на разных сайтах. Спасибо за ваши постоянные усилия и вклад в этой области. Это значительно облегчает жизнь таким разработчикам, как я :-) - person EvilDr; 28.03.2013

Вместо проверки IsPostBack вы можете добавить параметр строки запроса и проверить его наличие. Вы можете сделать это либо когда пользователь запрашивает авторизацию, либо когда провайдер возвращается обратно.

Этот фрагмент ниже проверяет наличие параметра строки запроса, который указывает, что поставщик перенаправил обратно на вашу страницу.

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
person gowansg    schedule 26.03.2013
comment
Привет, да, спасибо за это. Это была моя первая мысль, но мне интересно узнать, есть ли стандартный подход к этому с DotNetOpenAuth ...? - person EvilDr; 27.03.2013
comment
нет необходимости в искусственном параметре обратного вызова - person Andrew Arnott; 27.03.2013