2012-12-24 84 views
6

更新 感謝@IvanL的評論,事實證明問題是Google特有的。自那以後,我嘗試了其他提供者,並且這些一切都按預期工作。谷歌似乎沒有發送索賠信息。目前尚無法弄清楚爲什麼我需要以不同的方式讓Google發送它。IAuthenticationResponse.GetExtension <ClaimsResponse>()總是返回null

黑暗中的野蠻刺說它可能與默認爲http://:/的領域有關,因爲我已經看到Andrew Arnott回答Google改變了基於領域的相同帳戶的聲明標識符通過身份驗證請求傳遞。

另一個可能很重要的信息消息:與使用dotnetopenauth可以在網絡上發現的許多示例不同,我沒有使用「簡單」文本框並自己編寫openIdIdentifier,但我使用的是openID selector,正在提供傳遞給ValidateAtOpenIdProvideropenIdIdentifier。 (根據Adding OpenID authentication to your ASP.NET MVC 4 application文章。)

問題是:爲什麼是IAuthenticationResponse.GetExtension()使用谷歌的OpenID提供商的時候總是返回null,否則,當所有相關的疑難雜症的對於谷歌(請根據需要,AXFetchAsSregTransform電子郵件,等)已解決?

原始

我與得到DotNetOpenAuth解析從供應商返回的響應掙扎。遵循Adding OpenID authentication to your ASP.NET MVC 4 application的說明,直到登錄應該起作用,登錄結果返回到主頁,並在右上角顯示用戶名(暱稱)。 (這取決於「用戶應該在這一點上看到以下內容:」剛剛超過文章的一半)。

我正在使用Visual Studio Web Developer 2010 Express與C#。 DotNetOpenAuth版本是4.0.3.12153(根據Windows資源管理器根據packages.config,4.0.3.12163)。

我的web.config被修改遵循Activating AXFetchAsSregTransform這對DotNetOpenId - Open Id get some data

解決方案的說明可惜它不是足以讓它爲我工作。

openid-selector工作正常,導致正確選擇openid提供程序。身份驗證請求創建如下:

public IAuthenticationRequest ValidateAtOpenIdProvider(string openIdIdentifier) 
    { 
     IAuthenticationRequest openIdRequest = openId.CreateRequest(Identifier.Parse(openIdIdentifier)); 

     var fields = new ClaimsRequest() 
     { 
      Email = DemandLevel.Require, 
      FullName = DemandLevel.Require, 
      Nickname = DemandLevel.Require 
     }; 
     openIdRequest.AddExtension(fields); 

     return openIdRequest; 
    } 

這一切都有效。我可以登錄和授權頁面收到我的信息,然後導致調用GetUser

public OpenIdUser GetUser() 
    { 
     OpenIdUser user = null; 
     IAuthenticationResponse openIdResponse = openId.GetResponse(); 

     if (openIdResponse.IsSuccessful()) 
     { 
      user = ResponseIntoUser(openIdResponse); 
     } 

     return user; 
    } 

openIdResponse.IsSuccessful實現爲一個擴展方法(見鏈接的文章):

return response != null && response.Status == AuthenticationStatus.Authenticated; 

始終是成功的,因爲輸入的ResponseIntoUser方法是:

private OpenIdUser ResponseIntoUser(IAuthenticationResponse response) 
    { 
     OpenIdUser user = null; 
     var claimResponseUntrusted = response.GetUntrustedExtension<ClaimsResponse>(); 
     var claimResponse = response.GetExtension<ClaimsResponse>(); 

     // For this to work with the newer/est version of DotNetOpenAuth, make sure web.config 
     // file contains required settings. See link for more details. 
     // http://www.dotnetopenauth.net/developers/help/the-axfetchassregtransform-behavior/ 

     if (claimResponse != null) 
     { 
      user = new OpenIdUser(claimResponse, response.ClaimedIdentifier); 
     } 
     else if (claimResponseUntrusted != null) 
     { 
      user = new OpenIdUser(claimResponseUntrusted, response.ClaimedIdentifier); 
     } 
     else 
     { 
      user = new OpenIdUser("[email protected];ikke van ikkenstein;ikke nick;ikkeclaimedid"); 
     } 
     return user; 
    } 

我的版本僅上面從代碼的不同之處鏈接的物品b我添加了最後的else塊,以確保始終顯示帶有用戶名和註銷鏈接的主頁(這有助於在嘗試連續多次執行此操作時提供幫助)。

我已經嘗試過谷歌和雅虎。兩種身份驗證都很好,都會返回由WebDev服務器記錄的身份斷言。但是,GetUntrustedExtenstionGetExtension總是返回null。我總是會從最後一個人看到「ikke nick」,而不是我實際用於認證的名字。

我對如何繼續嘗試並使其發揮作用感到茫然。這可能是我的一些疏漏(我是一位經驗豐富的開發人員,但剛剛開始將我的腳趾浸入C#和Web前端開發中),我看不到它。

任何和所有關於如何進行/調試的建議都非常受歡迎。

+1

你可以[激活日誌](http://tinyurl.com/dnoalogs)並添加日誌到你的問題? –

+0

另請注意,我剛剛添加到您引用的教程中的評論中,該評論指出使用電子郵件地址作爲用戶名是非常不安全的。您必須使用ClaimedIdentifier作爲用戶名,並且如果您願意,只能將用戶的電子郵件地址顯示爲友好標識符。 –

+0

@AndrewArnott:謝謝,是的,我看到您在其他問題中使用電子郵件地址的言論,並同意。本教程只是讓我的腳溼潤......我會添加日誌記錄並回傳(可能會有一段時間,即將走出聖誕節海灘散步)。 –

回答

0

您是否將Google用作OpenId提供程序來測試您的解決方案?由於Google只有在您第一次驗證應用程序時纔有/包含索賠的習慣。因此,也許嘗試使用新的谷歌帳戶,看看是否可行?

對不起,響應緩慢,本週在客戶端進行大規模遷移:-)很高興看到這個小小的評論解決了您的問題。

+0

可惜的是,決議是谷歌顯然沒有發出聲明,即使在第一次身份驗證...(見我後來的評論和更新問題)啊,我會發表另一個問題,如何讓谷歌實際發送信息... –