更新 感謝@IvanL的評論,事實證明問題是Google特有的。自那以後,我嘗試了其他提供者,並且這些一切都按預期工作。谷歌似乎沒有發送索賠信息。目前尚無法弄清楚爲什麼我需要以不同的方式讓Google發送它。IAuthenticationResponse.GetExtension <ClaimsResponse>()總是返回null
黑暗中的野蠻刺說它可能與默認爲http://:/的領域有關,因爲我已經看到Andrew Arnott回答Google改變了基於領域的相同帳戶的聲明標識符通過身份驗證請求傳遞。
另一個可能很重要的信息消息:與使用dotnetopenauth可以在網絡上發現的許多示例不同,我沒有使用「簡單」文本框並自己編寫openIdIdentifier,但我使用的是openID selector,正在提供傳遞給ValidateAtOpenIdProvider
的openIdIdentifier
。 (根據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服務器記錄的身份斷言。但是,GetUntrustedExtenstion
和GetExtension
總是返回null。我總是會從最後一個人看到「ikke nick」,而不是我實際用於認證的名字。
我對如何繼續嘗試並使其發揮作用感到茫然。這可能是我的一些疏漏(我是一位經驗豐富的開發人員,但剛剛開始將我的腳趾浸入C#和Web前端開發中),我看不到它。
任何和所有關於如何進行/調試的建議都非常受歡迎。
你可以[激活日誌](http://tinyurl.com/dnoalogs)並添加日誌到你的問題? –
另請注意,我剛剛添加到您引用的教程中的評論中,該評論指出使用電子郵件地址作爲用戶名是非常不安全的。您必須使用ClaimedIdentifier作爲用戶名,並且如果您願意,只能將用戶的電子郵件地址顯示爲友好標識符。 –
@AndrewArnott:謝謝,是的,我看到您在其他問題中使用電子郵件地址的言論,並同意。本教程只是讓我的腳溼潤......我會添加日誌記錄並回傳(可能會有一段時間,即將走出聖誕節海灘散步)。 –