16

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 -- トークン応答を返しています。

他に何が適切かはわかりませんので、必要に応じてさらに情報を提供します。

4

2 に答える 2

46

リクエストで「offline_access」を明示的に要求する必要があります。要求している他のスコープはスペースで区切ります。(以下の例では、'Default' を 'MyApi' に置き換えて、アプリで定義されたスコープについて話していることを明確にしています。)

&scope=MyApi offline_access 

ただし、そのクライアントに更新トークンを取得する権利も付与する必要があります。これは、選択したフローに基づいて発生するだけではありません。

var client = new Client()
{
    ... //All the stuff you were doing before

    ScopeRestrictions = new List<string>
    { 
        "MyApi",
        StandardScopes.OfflineAccess.Name, //"offline_access" -for refresh tokens
        //Other commonly requested scopes:
        //StandardScopes.OpenId.Name, //"openid"
        //StandardScopes.Email.Name,  //"email"

    },
}

スコープ ストアにも「offline_access」を追加する必要がある場合があります。スコープ ストアは、Identity Server が認識しているスコープのリストです。あなたの質問には、スコープ ストアがプロジェクトでどのように設定されているかについては言及されていないため、既にお持ちの可能性があります。ただし、上記がすぐにうまくいかない場合は、作業中の例で次のようなコードを探して、OfflineAccess を追加することをお勧めします。

var scopeStore = new InMemoryScopeStore(new Scope[]{
    StandardScopes.OpenId,
    StandardScopes.Profile,
    StandardScopes.Email,
    StandardScopes.OfflineAccess,  //<--- ensure this is here to allow refresh tokens
    new Scope{
        Enabled = true,
        Name = "MyApi"
    },
}
于 2015-07-14T17:12:32.937 に答える