2009-07-04 80 views
7

我想通过开放ID验证后如何获取用户信息。无论我何时致电无法从DotNetOpenId响应获取属性

response.GetExtension<ClaimsResponse> 

//Or 

response.GetExtension<FetchResponse> 

//Or 

response.GetUntrustedExtension<ClaimsResponse> 

// OR 

response.GetUntrustedExtension<FetchResponse> 

我总是收到一个空引用,无论我是否提供ClaimRequest或FetchRequest都没有关系。我添加的信息就像我见过的所有例子一样:

request.AddExtension(new ClaimsRequest{ Email = DemandLevel.Require }); 

// Or 

var fetch = new FetchRequest(); 
fetch.Attributes.AddRequired(WellKnownAttributes.Contact.Email); 
request.AddExtension(fetch); 

任何想法我做错了什么?

更新

添加由安德鲁建议的配置信息得到了我的存在方式的一部分。我终于获得了response.GetUntrustedExtension<ClaimsResponse>的ClaimsResponse,但response.GetExtension<ClaimsResponse>仍然返回null。另外返回的ClaimsResponse实际上并不包含我请求的任何数据。这里的要求:

var request = openId.CreateRequest(Request.Form["openid_identifier"]); 
request.AddExtension(new ClaimsRequest 
    { 
     BirthDate = DemandLevel.Request, 
     Country = DemandLevel.Request, 
     Email = DemandLevel.Require, 
     FullName = DemandLevel.Request, 
     Gender = DemandLevel.Request, 
     Language = DemandLevel.Request, 
     Nickname = DemandLevel.Request, 
     PostalCode = DemandLevel.Request, 
     TimeZone = DemandLevel.Request 
     }); 

     return request.RedirectingResponse.AsActionResult(); 

这里是我的配置

<uri> 
    <idn enabled="All"/> 
    <iriParsing enabled="true"/> 
    </uri> 
    <dotNetOpenAuth> 
    <openid maxAuthenticationTime="0:05"> 
     <relyingParty> 
     <security 
        requireSsl="false" 
        minimumRequiredOpenIdVersion="V10" 
        minimumHashBitLength="160" 
        maximumHashBitLength="256" 
        requireDirectedIdentity="false" 
        requireAssociation="false" 
        rejectUnsolicitedAssertions="false" 
        rejectDelegatingIdentifiers="false" 
        ignoreUnsignedExtensions="false" 
        privateSecretMaximumAge="07:00:00" /> 
     <behaviors> 
      <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" /> 
     </behaviors> 
     </relyingParty> 
    </openid> 
    <messaging> 
     <untrustedWebRequest> 
     <whitelistHosts> 
      <!-- since this is a sample, and will often be used with localhost --> 
      <add name="localhost" /> 
     </whitelistHosts> 
     </untrustedWebRequest> 
    </messaging> 

我跑v3.2.0.9177

+0

你可以加入你正在测试的OP吗? – 2009-07-05 01:20:48

+0

行为配置会导致ClaimsResponse始终存在,即使没有任何值,就像您说的那样。它看起来像你的代码是正确的,因为myopenid支持sreg和AX我很惊讶这不适合你。我会看看我是否可以做更多的调查。 – 2009-07-05 14:59:55

回答

10

这很可能是该供应商你测试不支持这些扩展。或者,如果它是谷歌,它只回答一次问题(除非在登录时注意而不是请假记住我)。

现在使用DotNetOpenAuth v3.2,发送扩展的最佳方式可能是使用新的属性扩展'behavior'。根据提供商的不同,它会自动使用sreg和/或AX(最多三种不同的AX格式),以最大限度地提高获得有用结果的机会,前提是提供商完全支持这些扩展。

将此位粘贴到您的web.config文件中,其中full configuration wiki page中建议的位置。

<behaviors> 
    <add type="DotNetOpenAuth.OpenId.Behaviors.AXFetchAsSregTransform, DotNetOpenAuth" /> 
</behaviors> 

然后使用ClaimsRequest/ClaimsResponse(SREG),而不是AX” FetchRequest,这样的行为可以做其工作。

既然你提到你正在对myopenid.com进行测试,那么当你测试一个位于'localhost'上的RP时,我似乎也会抛头露面,看起来他们已经关闭了扩展支持。您的RP显然必须是公开的,并且甚至可以发现(根据用于RP发现的OpenID 2.0规则),以使属性请求得到遵守。这可能是你遇到的问题。