Asp.net mvc 用于Google的DotNetOpenAuth OAuth2客户端存在问题

Asp.net mvc 用于Google的DotNetOpenAuth OAuth2客户端存在问题,asp.net-mvc,asp.net-mvc-4,oauth-2.0,google-oauth,Asp.net Mvc,Asp.net Mvc 4,Oauth 2.0,Google Oauth,我有一个ASP.NETMVC4应用程序。 昨天,我的用户开始抱怨他们无法使用谷歌账户登录。经过大量的谷歌搜索,我发现了这个:。我按照指示做了 我在Google控制台中为web应用程序创建了客户端ID 在AuthConfig.RegisterAuth()中,我有: 我有两个问题: 更改之前,result.UserName包含用户电子邮件。现在它包含名称。但是我需要电子邮件。除此之外,注册也可以 我最大的问题是,现有用户无法使用他们的谷歌帐户登录。代码转到“//用户是新用户,请为他们询问所需的成员名

我有一个ASP.NETMVC4应用程序。 昨天,我的用户开始抱怨他们无法使用谷歌账户登录。经过大量的谷歌搜索,我发现了这个:。我按照指示做了

我在Google控制台中为web应用程序创建了客户端ID

在AuthConfig.RegisterAuth()中,我有:

我有两个问题:

  • 更改之前,
    result.UserName
    包含用户电子邮件。现在它包含名称。但是我需要电子邮件。除此之外,注册也可以

  • 我最大的问题是,现有用户无法使用他们的谷歌帐户登录。代码转到
    “//用户是新用户,请为他们询问所需的成员名称”
    。对于同一电子邮件地址,我现在获得的ProviderUserId不同


  • 非常感谢您的建议。

    您可以配置此库以将其他参数传递给Google授权服务吗?如果是这样,您应该传递'openid.realm=$your\u app\u openid2\u realm'(如果您的应用之前配置为openid2,它很可能在其请求中声明了'realm'值,您应该使用相同的值)


    在本例中,您将从Google收到两个标识符。新的(与配置文件URL和更多Google API兼容)和旧的(作为openid_id返回)。

    是的,这个库很可能可以传递额外的参数,有一个字典参数extraData。我不确定以前使用了什么,我只是使用了ASP.NET MVC 4应用程序的默认安全模型。在Auth.Config中只有
    OAuthWebSecurity.RegisterGoogleClient()。我试图在整个解决方案中搜索“openid”和“realm”,但没有成功。请问有人知道ASP.NET MVC在使用
    OAuthWebSecurity.RegisterGoogleClient()时向google发送了什么吗?拜托,有人知道吗?我被卡住了,我的用户无法登录。我相信很多人都不得不面对这个问题。非常感谢你的帮助。
    
    var client = new DotNetOpenAuth.GoogleOAuth2.GoogleOAuth2Client(googleClientID, googleClientSecret);
    var extraData = new Dictionary<string, object>();
    OAuthWebSecurity.RegisterClient(client, "Google", extraData);
    
    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 });
                }
            }