Несколько подсказок в моем сообщении в блоге Как практически гарантировать, что вы можете получить адрес электронной почты с OpenID .
Короче говоря, вам нужно активировать поведение AXFetchAsSregTransform :
<configuration>
<configSections>
<section name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection" requirePermission="false" allowLocation="true"/>
</configSections>
<dotNetOpenAuth>
<openid>
<relyingParty>
<behaviors>
<!-- The following OPTIONAL behavior allows RPs to use SREG only, but be compatible
with OPs that use Attribute Exchange (in various formats). -->
<add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" />
</behaviors>
</relyingParty>
</openid>
</dotNetOpenAuth>
</configuration>
И затем вам нужно сообщить провайдеру, что вам требуется адрес электронной почты пользователя. В идеале это должно быть сделано так:
<rp:OpenIdButton runat="server"
Text="Log in with Google"
Identifier="https://www.google.com/accounts/o8/id">
<Extensions>
<sreg:ClaimsRequest Email="Require" />
</Extensions>
</rp:OpenIdButton>
Однако в DotNetOpenAuth есть ошибка (v3.4.7 исправляет это), которая не позволяет тегу <Extensions>
работать на OpenIdButton
. Поэтому вместо этого вы должны добавить запрос атрибута в свой код. Итак, ваш тег выглядит так:
<rp:OpenIdButton runat="server"
Text="Log in with Google"
OnLoggingIn="OpenId_LoggingIn"
Identifier="https://www.google.com/accounts/o8/id" />
А у вашего кода есть такой метод:
protected void OpenId_LoggingIn(object sender, OpenIdEventArgs e) {
e.Request.AddExtension(new ClaimsRequest() { Email = DemandLevel.Require });
}