Thinktecture の Identity Server 3 をセットアップしようとしているのですが、認証コードを交換するとき (または ResourceOwner フローを使用するとき) にリフレッシュ トークンを返してもらうことができないようですが、認証コードに焦点を当てます。それは今の私にとってより重要だからです)。アクセス トークンを取得し、それらを使用して正常に認証できますが、返されることを期待している更新トークンを生成していないようです。Identity Server が更新トークンを返すようにするために何か特別なことをする必要はありますか?
私はドキュメントに目を通しましたが、間違って設定したものは何も見ていません.更新トークンに関する彼らのページで私が行っていない唯一のことは、ユーザーを送信するときに「offline_access」スコープを明示的に要求することです.試行するたびに「無効なスコープ」エラーが発生するため、認証のためにそこにあります。したがって、Thinktecture の「(コードまたはリソース オーナー フローを介して) offline_access スコープを要求する」という言い回しは、offline_access スコープが、使用しているフローに基づいて自動的に要求されるものであることを意味します。
私はできる限り彼らのサンプル アプリケーション (およびKatana プロジェクトの既存の Owin ミドルウェアのソース コード) に従うように努めてきました。私のセットアップは次のとおりです。
- クライアントクラスを使用してクライアントを作成し、次を手動で指定しました。
var クライアント = 新しいクライアント() { ClientId = "SomeId", ClientName = "認証コード フローを持つクライアント", RequireConsent = false, //これを true に設定しても役に立たなかった フロー = Flows.AuthorizationCode, ClientSecrets = 新しいリスト() { new ClientSecret("シークレット") }、 RedirectUris = 新しいリスト() { 「localhost:/特定のリダイレクトパス」 } };
- 次のように Authorization エンドポイントを呼び出しています。
var authenticationEndpoint = AuthorizationEndpointBase + "?client_id=" + Uri.EscapeDataString(Options.ClientId) + "&scope=デフォルト" + "&response_type=コード" + "&redirect_uri=" + Uri.EscapeDataString(redirectUri) + "&state=" + Uri.EscapeDataString(状態); Response.Redirect(authorizationEndpoint);
ここで、「デフォルト」は私が作成したスコープです。 - コールバックでは、次のようにトークン エンドポイントを呼び出します。
IReadableStringCollection クエリ = Request.Query; 文字列コード = getValueFromQueryString("コード", クエリ); var tokenRequestParameters = 新しいリスト>() { new KeyValuePair("client_id", Options.ClientId), new KeyValuePair("redirect_uri", GenerateRedirectUri()), new KeyValuePair("client_secret", Options.ClientSecret), new KeyValuePair("コード", コード), new KeyValuePair("grant_type", "authorization_code"), }; var requestContent = 新しい FormUrlEncodedContent(tokenRequestParameters); HttpResponseMessage 応答 = await _httpClient.PostAsync(TokenEndpoint, requestContent, Request.CallCancelled); response.EnsureSuccessStatusCode(); string oauthTokenResponse = await response.Content.ReadAsStringAsync();
トークン エンドポイントを呼び出すと、Identity Server へのログオンに次のように表示されます (認証コードの検証後)。
iisexpress.exe 情報: 0: [Thinktecture.IdentityServer.Core.Validation.TokenRequestValidator]: 7/13/2015 1:44:07 PM +00:00 -- トークン要求の検証成功 { "ClientId": "SomeId", "ClientName": "認証コード フローを持つクライアント", "GrantType": "authorization_code", "AuthorizationCode": "f8f795e649044067ebd96a341c5af8c3" } iisexpress.exe 情報: 0 : [Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]: 7/13/2015 1:44:07 PM +00:00 -- トークン応答を作成中 iisexpress.exe 情報: 0: [Thinktecture.IdentityServer.Core.ResponseHandling.TokenResponseGenerator]: 7/13/2015 1:44:07 PM +00:00 -- 認証コード要求の処理中 デバッグ: [Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]: 7/13/2015 1:44:07 PM +00:00 -- アクセス トークンを作成しています デバッグ: [Thinktecture.IdentityServer.Core.Services.Default.DefaultTokenService]: 7/13/2015 1:44:07 PM +00:00 -- 参照アクセス トークンを作成しています iisexpress.exe 情報: 0 : [Thinktecture.IdentityServer.Core.Endpoints.TokenEndpointController]: 7/13/2015 1:44:07 PM +00:00 -- トークン要求の終了 iisexpress.exe 情報: 0: [Thinktecture.IdentityServer.Core.Results.TokenResult]: 7/13/2015 1:44:07 PM +00:00 -- トークン応答を返しています。
他に何が適切かはわかりませんので、必要に応じてさらに情報を提供します。