2009-07-04 117 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規則),以使屬性請求得到遵守。這可能是你遇到的問題。