DotNetOpenAuth的问题OAuth2 Client for Google

时间:2015-04-23 06:17:26

标签: asp.net-mvc asp.net-mvc-4 oauth-2.0 google-oauth

我有一个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 });
            }
        }

我有两个问题:

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

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

  3. 非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

您是否可以配置此库以将其他参数传递给Google授权服务?如果是这样,你应该通过&lt; openid.realm = $ your_app_openid2_realm&#39; (如果您的应用之前已经为OpenID2配置了,它很可能在其请求中声明了一个“领域”值,那么您应该使用相同的值。)

在这种情况下,您将从Google收到两个标识符。新的(与个人资料网址和更多的Google API兼容)和旧的(与openid_id一起返回)。