我在IdentityServer4中请求新的刷新令牌时遇到了一些问题。在身份验证后的某个时间,我从我的Api获得了未经授权的响应,确定,但是当我尝试请求新的刷新令牌时,我从服务器获取invalid_grant。我确定我设置了offline_access,但仍然有问题。这是我的代码:
我在Server Config.cs中的客户端
new Client
{
ClientId = "myclientId",
ClientName = "MyClient",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
RequireConsent = false,
ClientSecrets =
{
new Secret("mySecret".Sha256())
},
RedirectUris = { "http://localhost:5002/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
AllowOfflineAccess = true,
UpdateAccessTokenClaimsOnRefresh = true,
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OfflineAccess,
...
}
}
来自MVCclient的My Startup.cs
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = "Cookies",
AccessDeniedPath = "/Home/Error403"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
Authority = Configuration["Identity.Url"],
RequireHttpsMetadata = false,
ClientId = Configuration["ClientId"],
ClientSecret = Configuration["ClientSecret"],
ResponseType = "code id_token",
Scope = { "openid profile offline_access" },
GetClaimsFromUserInfoEndpoint = true,
SaveTokens = true,
});
我在这里获得invalid_grant
var disco = await DiscoveryClient.GetAsync(Configuration["Identity.Url"]);
if (disco.IsError) throw new Exception(disco.Error);
var tokenClient = new TokenClient(disco.TokenEndpoint, Configuration["ClientId"],
Configuration["ClientSecret"]);
var rt = await HttpContext.Authentication.GetTokenAsync("refresh_token");
var tokenResult = await tokenClient.RequestRefreshTokenAsync(rt);
tokenResult接收invalid_grant。我错过了什么吗?
答案 0 :(得分:1)
我发现当IIS将IdentityServer置于睡眠状态时会发生这种情况。我们的开发服务器没有“保持活动/唤醒”策略,因此,如果放置一段时间(我认为20分钟),该站点将进入睡眠状态……再次使用时,这会打乱使用的任何尝试刷新令牌,但是奇怪的是,它没有声明我有无效的刷新令牌,而是在响应中出现了“ Invalid Grand Type”错误。
答案 1 :(得分:0)
尝试在mvc客户端配置中更改此行
Scope = { "openid", "profile", "offline_access" }
注意每个范围的引号
答案 2 :(得分:0)
我刚刚遇到了同样的错误。我注意到当我尝试在短时间内刷新访问令牌时发生错误,例如。每秒两次。
解决方案是将客户端的数据库(表 RefreshTokenUssage
)中的 dbo.Clients
参数增加到 10(原始值为 1)。