gpt4 book ai didi

c# - IdentityServer4 刷新 token 为空

转载 作者:行者123 更新时间:2023-11-30 14:07:29 25 4
gpt4 key购买 nike

我已经为这个问题绞尽脑汁好几天了。我在 IdentityServer4 中遇到问题,其中 token 响应不包含刷新 token 。我已经使用的代码在获取访问 token 方面工作正常 - 它只是我似乎无法弄清楚的刷新 token 。

在我的 project.json 文件中,我添加了以下条目:

"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();
}

您可能已经注意到我正在使用 Config.Clients、Config.Scope 和 Config.Users。这是这些 (Config.cs) 的代码:

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 以获取 token :

[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!?
}
}

我已经阅读了很多文章,但我找不到他们单独关注刷新 token 的地方。他们似乎都只关注返回访问 token 的基本代码。

有人可以告诉我我错过了什么,也许可以向我展示/指出正确的方向吗?任何帮助将不胜感激!

最佳答案

请求 token 时需要包含 offline_access 范围。

但是客户端凭据流不支持刷新 token - 因此这将不起作用。

关于c# - IdentityServer4 刷新 token 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40630353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com