2016-07-28 7 views
0

私が作成したサイトでテストを実行していて、更新トークンを取得してクレームとして保存しようとしていますが、常にnullが返されます。それ以前は動作しなかったことに注意してください。ただし、各ブラウザ(Chrome、Firefox、Internet Explorer)で初めて動作しました。C#Google OAuth2 nullリフレッシュトークン:新しい方法を開始するには?

すべてのテストでAccessTypeが "オフライン"に設定されています。 approval_prompt/ApprovalPromptを "強制"に指定することはできません。そして、ドキュメントでは、AccessTypeを「オフライン」に設定してリフレッシュトークンを取得するように指示しています(これは私がやっていることです)。

私は、連続したヌルリフレッシュトークンが、見つからないSQLServerデータベースのどこかに格納されたデータと関係があり、削除する必要があると考えています。また、C#コード内でApprovalPrompt/approval_promptを "force"に設定することができない可能性があります。

シナリオ:

  1. 私はChromeでサイト、登録作品やリフレッシュトークン上に新しいユーザーを作成

    が提供されます。再度チェックするには、ユーザーとユーザーの申し立てを削除してChromeでもう一度試しますが、今回は同じメールアドレスの登録試行で更新トークンは表示されません。ユーザ/クレームデータから削除される

    テーブルは、次のとおり

    aspnet_Applications

    aspnet_Membership

    aspnet_Users

    aspnet_UsersInRoles

    aspnet_Profiles

    [AspNetUserClai MS]

    [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); 

私はクローム/ Firefoxの/ IEのキャッシュをクリアすることについて考えたが、私はそれを行う必要はありません...これについてのご意見をお寄せください。また、私がユーザーとそのクレームを新しく始めるためにリセットできるとどう思いますか。ありがとう!

答えて

1

これを実証しました。グーグルにログインし、アプリの権限ページを訪問した

  1. https://security.google.com/settings/security/permissions?pli=1

  2. 一度そこに、私の電子メールアカウントのトークンへのアクセスを取り消します。

  3. 私のアプリをもう一度走らせたとき、私は今度はアクセス/許可に同意してから、私にリフレッシュトークンを提供しました!

これは、同様の問題に遭遇した人に役立ちます。

関連する問題