1

私はすでにこの問題について私の頭を掻き集めていました。トークンレスポンスにリフレッシュトークンが含まれていないIdentityServer4に問題があります。アクセストークンを取得することに関して、私がすでにうまく機能しているコードです。これは、リフレッシュトークンではわかりません。私project.jsonファイルでIdentityServer4リフレッシュトークンがNullです

、私は次のエントリを追加しました:

"IdentityServer4": "1.0.0-rc3", 
"IdentityServer4.AccessTokenValidation": "1.0.1-rc3" 

マイStartup.csファイルには、次のものが含まれています

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddIdentityServer() 
     .AddInMemoryClients(Config.Clients.Get()) 
     .AddInMemoryScopes(Config.Scopes.Get()) 
     .AddInMemoryUsers(Config.Users.Get()) 
     .AddTemporarySigningCredential(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseIdentityServer(); 
} 

あなたは、私がコンフィグを使用していますことに気づいたかもしれません.Clients、Config.Scope、およびConfig.Users。

public class Config 
{ 
    internal class Clients 
    { 
     public static IEnumerable<Client> Get() 
     { 
      return new List<Client> { 
       new Client 
       { 
        ClientId = "client", 
        ClientName = "Authentication Client", 
        AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 
        AccessTokenLifetime = 1800, 
        RefreshTokenExpiration = TokenExpiration.Absolute, 
        AbsoluteRefreshTokenLifetime = 1800, 
        ClientSecrets = new List<Secret> { 
         new Secret("secret".Sha256()) 
        }, 
        AllowedScopes = new List<string> 
        { 
         "api", 
         StandardScopes.OfflineAccess.Name, //For refresh tokens 

        } 
       } 
      }; 
     } 
    } 

    internal class Scopes 
    { 
     public static IEnumerable<Scope> Get() 
     { 
      return new List<Scope> 
      { 
       StandardScopes.OfflineAccess, //For refresh tokens 
       new Scope { 
        Name = "api", 
        DisplayName = "API", 
        Description = "API scope", 
        Type = ScopeType.Resource, 
        Claims = new List<ScopeClaim> { 
         new ScopeClaim(JwtClaimTypes.Role) 
        }, 
        ScopeSecrets = new List<Secret> { 
         new Secret("secret".Sha256()) 
        } 
       } 
      }; 
     } 
    } 

    internal class Users 
    { 
     public static List<InMemoryUser> Get() 
     { 
      return new List<InMemoryUser> 
      { 
       new InMemoryUser { 
        Subject = "5BE86359-073C-434B-AD2D-A3932222DABE", 
        Username = "admin", 
        Password = "admin", 
        Claims = new List<Claim> { 
         new Claim(JwtClaimTypes.Role, "admin") 
        } 
       } 
      }; 
     } 
    } 
} 

そして、私はトークンを得るために、このIdentityController.csを呼び出しています:ここでは、これらのコード(Config.cs)である

[Route("api/[controller]")] 
public class IdentityController : ControllerBase 
{ 
    [HttpPost("GetToken")] 
    public string GetToken() 
    { 
     DiscoveryResponse dr = new DiscoveryClient("http://localhost:5000").GetAsync().Result; 
     TokenClient tokenClient = new TokenClient(dr.TokenEndpoint, "client", "secret", AuthenticationStyle.BasicAuthentication); 
     TokenResponse tokenResponse = tokenClient.RequestClientCredentialsAsync("api").Result; 

     return tokenResponse.AccessToken; //"tokenResponse" does not contain the refresh token!? 
    } 
} 

私はかなりの数の記事を読んだことがあるが、しかし、どこでリフレッシュトークンだけに焦点を当てるのか分かりません。それらはすべてアクセストークンを返す基本コードにのみ焦点を当てているようです。

誰かが私に迷っていることを教えてもらえますか、私に正しい方向を示す/示唆するかもしれませんか?どんな助けでも大歓迎です!

答えて

2

トークンを要求するときにoffline_accessスコープを含める必要があります。

しかし、クライアントの資格情報フローにはリフレッシュトークンがサポートされていないため、これは機能しません。

+0

これを達成するために何かを変更することはできますか?または、リフレッシュトークンを取得することは現時点で不可能ですか? –

+1

私たちにコードを投げるのではなく、あなたが実際にやろうとしていることを説明することから始まるかもしれません。 – leastprivilege

+0

心配する必要はありません。現時点では不可能なように私はリフレッシュトークンをもう使用しません –

関連する問題