C# Google OAuth2 null 刷新令牌:如何重新开始?

C# Google OAuth2 null Refresh Tokens: How to start fresh?

我正在 运行 测试我构建的网站并尝试获取刷新令牌以作为声明存储,但它始终 returns 为空。请注意它以前确实有效,但它只在每个浏览器中第一次有效(Chrome,然后是 Firefox,然后是 Internet Explorer)。

AccessType 在所有测试中都设置为“离线”。我无处可以将 approval_prompt/ApprovalPrompt 指定为“强制”,无论如何文档说将 AccessType 设置为“离线”以获取刷新令牌(这就是我正在做的)。

我怀疑连续的空刷新标记与存储在 SQLServer 数据库某处的数据有关,我找不到这些数据,我需要删除这些数据。也可能是我无法在 C# 代码中将 ApprovalPrompt/approval_prompt 设置为“强制”。

场景:

  1. 当我在 Chrome 的站点上创建新用户时,注册有效并提供了刷新令牌。为了仔细检查,我删除了用户和用户声明,然后在 Chrome 中重试,但这次使用相同的电子邮件地址尝试注册时没有提供刷新令牌。

    表 user/claim 数据从以下位置删除:

    aspnet_Applications

    aspnet_Membership

    aspnet_Users

    aspnet_Users角色

    aspnet_Profiles

    [AspNetUserClaims]

    [AspNetUserLogins]

    [AspNetUsers]

  2. 百思不得其解,于是在Firefox中试了一下。我注册了一个新用户(相同的电子邮件地址),并在第一次尝试时提供了一个刷新令牌。为了仔细检查,我删除了用户和用户声明,然后在 Firefox 中重试,这次使用相同的电子邮件地址进行以下注册尝试时没有提供刷新令牌。

  3. 我现在估计它只能在我还没有尝试注册帐户的浏览器中使用一次。所以我用 Internet Explorer 再试一次。我注册了一个新用户(相同的电子邮件地址),并在第一次尝试时提供了一个刷新令牌。但是和上次一样,当我尝试重新开始并删除所有用户数据并声称它不会在使用相同电子邮件地址的以下注册尝试中提供刷新令牌时。

什么给了?它是否识别出一些较旧的会话?我怎样才能完全删除所有用户数据和声明,以便它会给我一个刷新令牌,因为它第一次适用于每个浏览器,或者强制在此 C# 代码中显示批准提示?

代码如下:

var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
            {
                AccessType = "offline",
                Caption = "Needs authentication from Google+ to proceed.",
                ClientId = "xxx",
                ClientSecret = "xxx",
                Provider = new GoogleOAuth2AuthenticationProvider()
                {
                    OnAuthenticated = context =>
                    {
                        context.Identity.AddClaim(new Claim("GoogleAccessToken", context.AccessToken));

                        if (!String.IsNullOrEmpty(context.RefreshToken))
                        {
                            context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken));
                        }

                        context.Identity.AddClaim(new Claim("GoogleUserId", context.Id));
                        context.Identity.AddClaim(new Claim("GoogleUsername", context.Name));
                        context.Identity.AddClaim(new Claim("GoogleUserEmail", context.Email));
                        context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToString()));
                        var expiresInSec = (long)(context.ExpiresIn.Value.TotalSeconds);
                        context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToString()));

                        return Task.FromResult(true);
                    }
                },
            
                SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie
            };

            googleOAuth2AuthenticationOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email");
            googleOAuth2AuthenticationOptions.Scope.Add("https://www.googleapis.com/auth/consumersurveys");
        
            app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

我考虑过清除 Chrome/Firefox/IE 缓存,但我不应该那样做...请分享您对此的想法以及您认为我可以如何重置用户和他们的声明以重新开始。谢谢!

想通了。

  1. 登录到 Google 并访问了应用权限页面:https://security.google.com/settings/security/permissions?pli=1

  2. 在那里,撤销了对我的电子邮件帐户的令牌的访问权限。

  3. 当我再次 运行 我的应用程序时,它 "forced" 我同意 access/permissions 这一次,然后还为我提供了刷新令牌!

希望这可以帮助 运行 遇到类似问题的任何人。