【发布时间】:2020-08-05 10:00:34
【问题描述】:
我目前正在构建一个具有身份验证/授权的 WebApp 来访问它并访问多个 WebAPI,所有这些都指向 Identity Server 4 主机。 我遵循了 IdentityServer4 的官方文档及其演示以及客户端身份验证、令牌生成、用户登录、使用令牌成功调用 API,显然一切正常,但最近我注意到,在一段时间不活动后,调用API 开始接收 401,但客户端应用程序仍然使用相同的令牌。
是这样的:
- 启动带有调试功能的浏览器
- 使用某些用户登录
- 转到调用一个 API 为其检索数据的视图
- 继续导航和测试,其他一切正常
现在,问题(在前面的第 4 步之后)
- 停止调试但保持浏览器正常运行(保持 cookie)
- 更改代码,实现新东西(基本上是打发时间)
- 再次启动调试
- 在已经打开的浏览器上使用相同的会话/cookie,尝试在应用程序上导航可以正常工作,并且不需要重新登录
- 导航到将使用当前令牌调用 API 的视图,给我 401 而以前没有
我发现令牌已过期,Visual Studio 输出指出了这一点(同时检查https://jwt.io/ 上的令牌我可以确认日期时间)。 为什么调用 API 时相同的令牌对 ClientApp 工作正常?由于 API 的调用,我是否需要手动生成新令牌?
我使用的配置是:
---客户端应用程序---
new Client
{
ClientId = "idWebApp",
ClientSecrets = new List<Secret> { new Secret("secret".Sha256()) },
AllowedGrantTypes = GrantTypes.Hybrid,
AllowAccessTokensViaBrowser = false,
EnableLocalLogin = true,
RedirectUris = { "http://localhost:5901/signin-oidc" },
FrontChannelLogoutUri = "http://localhost:5901/signout-oidc",
PostLogoutRedirectUris = { "http://localhost:5901/signout-callback-oidc" },
AllowOfflineAccess = true,
AllowedScopes = new List<string>
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OfflineAccess,
"apiAccess",
},
RequireConsent = false,
}
---API资源---
(只需使用简单的 ctor 使用“名称”进行初始化)
new ApiResource("apiAccess")
---自定义声明---
new IdentityResource()
{
Name = "appCustomClaims",
UserClaims = new List<string>()
{
"customRole"
}
}
---ClientApp的启动代码---
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "http://localhost:5900";
options.RequireHttpsMetadata = false;
options.ClientId = "idWebApp";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.Scope.Add("profile");
options.Scope.Add("offline_access");
options.ClaimActions.MapUniqueJsonKey("offline_access", "offline_access");
options.Scope.Add("appCustomClaims");
options.ClaimActions.MapJsonKey("customRole", "customRole");
options.Scope.Add("apiAccess");
options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
options.TokenValidationParameters.RoleClaimType = "customRole";
});
【问题讨论】:
标签: authorization identityserver4 access-token