我有一个ASP.NET MVC 4应用程序。 昨天我的用户开始抱怨他们无法使用他们的Google帐户登录。经过大量的谷歌搜索后,我发现了这一点:DotNetOpenAuth.GoogleOAuth2。我按照说明进行操作。
我在Google控制台中为网络应用程序创建了客户端ID。
在AuthConfig.RegisterAuth()中我有:
var client = new DotNetOpenAuth.GoogleOAuth2.GoogleOAuth2Client(googleClientID, googleClientSecret);
var extraData = new Dictionary<string, object>();
OAuthWebSecurity.RegisterClient(client, "Google", extraData);
在AccountController中,我有类似的东西:
public ActionResult ExternalLoginCallback(string returnUrl)
{
DotNetOpenAuth.GoogleOAuth2.GoogleOAuth2Client.RewriteRequest();
AuthenticationResult result = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
if (!result.IsSuccessful)
{
return RedirectToAction("ExternalLoginFailure");
}
if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, createPersistentCookie: false))
{
// here I have some logic where is user sent when login was successfull
return RedirectToLocal(returnUrl);
}
if (User.Identity.IsAuthenticated)
{
// If the current user is logged in add the new account
OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, User.Identity.Name);
return RedirectToLocal(returnUrl);
}
else
{
// User is new, ask for their desired membership name
string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
// some logic
return View("ExternalLoginConfirmation", new RegisterExternalLoginModel { UserName = username, ExternalLoginData = loginData, EncryptedEmail = encryptedEmail });
}
}
我有两个问题:
在更改之前,result.UserName
包含用户电子邮件。现在它包含名称。但我需要电子邮件。除此之外,注册工作正常。
我最大的问题 - 现有用户无法使用他们的Google帐户登录。代码转到"// User is new, ask for their desired membership name"
。我现在获得的ProviderUserId对于相同的电子邮件地址是不同的。
非常感谢任何建议。
答案 0 :(得分:0)
您是否可以配置此库以将其他参数传递给Google授权服务?如果是这样,你应该通过&lt; openid.realm = $ your_app_openid2_realm&#39; (如果您的应用之前已经为OpenID2配置了,它很可能在其请求中声明了一个“领域”值,那么您应该使用相同的值。)
在这种情况下,您将从Google收到两个标识符。新的(与个人资料网址和更多的Google API兼容)和旧的(与openid_id一起返回)。