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

时间:2016-07-28 19:41:48

标签: c# asp.net-mvc google-api oauth2

我在我构建的网站上运行测试,并尝试将刷新令牌存储为声明,但它始终返回null。请注意它之前的DID工作,但它只在每个浏览器中首次运行(Chrome,然后是Firefox,然后是Internet Explorer)。

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

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

情景:

  1. 当我在Chrome网站上创建新用户时,注册工作并提供刷新令牌。要进行双重检查,我会删除用户和用户声明并在Chrome中再次尝试,但这次在使用相同电子邮件地址进行注册时没有给出刷新令牌。

    从以下位置删除表用户/声明数据:

    aspnet_Applications

    aspnet_Membership

    aspnet_Users

    aspnet_UsersInRoles

    aspnet_Profiles

    [AspNetUserClaims]

    [AspNetUserLogins]

    [AspNetUsers]

  2. 困惑,所以我在Firefox中尝试。我注册了一个新用户(相同的电子邮件地址),并在第一次尝试时提供了刷新令牌。要进行双重检查,我会删除用户和用户声明并在Firefox中再次尝试,这次使用相同的电子邮件地址进行以下注册尝试时不会给出刷新令牌。

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

  4. 是什么给出的?是否承认一些较旧的会话?如何将所有用户数据和声明完全删除,以便在第一次为每个浏览器工作时为其提供刷新令牌,或者在此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 个答案:

答案 0 :(得分:1)

想出来了。

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

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

  3. 当我再次运行我的应用程序时,它“强迫”我这次同意访问/权限,然后还向我提供了刷新令牌!

  4. 希望这有助于遇到类似问题的任何人。