2015-04-23 53 views
2

我有一个ASP.NET MVC 4应用程序。 昨天我的用户开始抱怨他们无法使用他们的Google帐户登录。大量的谷歌搜索后,我发现这个:DotNetOpenAuth.GoogleOAuth2。我遵照指示。用于Google的DotNetOpenAuth OAuth2客户端的问题

我在Google控制台中为Web应用程序创建了客户端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 }); 
      } 
     } 

我有两个问题:

  1. 之前更改,result.UserName包含用户电子邮件。现在它包含名称。但我需要电子邮件。除此之外,注册工作正常。

  2. 我最大的问题 - 现有用户无法使用他们的Google帐户登录。代码为"// User is new, ask for their desired membership name"。我现在得到的ProviderUserId对于同一个电子邮件地址是不同的。

非常感谢您的任何建议。

+0

请问,有人知道吗?我被卡住了,我的用户无法登录。我相信很多人不得不处理这个问题。非常感谢您的帮助。 –

回答

0

您可以配置此库以将其他参数传递给Google授权服务吗?如果是这样,你应该通过'openid.realm = $ your_app_openid2_realm'(如果你的应用程序之前配置了OpenID2,它很可能在其请求中声明了'领域'值,你应该使用相同的值)。

在这种情况下,您会收到来自Google的两个标识符。新版本(与配置文件网址和更多Google API兼容)和旧版本(作为openid_id返回)。

+0

是的,这个库很可能会传递额外的参数,还有一个Dictionary参数extraData。我不确定之前使用过什么,我只是使用ASP.NET MVC 4应用程序的默认安全模型。在Auth.Config中,只有'OAuthWebSecurity.RegisterGoogleClient();'。我试图搜索“openid”和“realm”的整个解决方案并没有成功。 –

+0

请问有人知道什么ASP.NET MVC发送到谷歌时使用OAuthWebSecurity.RegisterGoogleClient();? –