WebApi服务器启动后只访问一次IdentityServer

WebApi server only accesses IdentityServer once after it starts

美好的一天。

  1. 我使用 IdentityServer 请求访问令牌
  2. 我在启动 Webapi 服务器后访问我的 API。
  3. 之后,使用当前的访问令牌,我可以访问我的 api,即使 IdentityServer 已关闭。

我的问题:这是正确的工作逻辑吗?难道不应该在每次调用我的 api 时调用 IdentityServer 并检查访问令牌吗?

如果没有,如果我的用户凭据已更改并且我需要更新令牌,我该如何拒绝访问令牌?

Startup.cs:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers().RequireAuthorization("ApiScope");
                //.RequireAuthorization("AdminSecure");
            });
        }

public void ConfigureServices(IServiceCollection services)
        {
           services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = Configuration.GetValue<string>("IdentityServerUrl");
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateAudience = false
                    };
                });
            services.AddAuthorization(options =>
            {
                options.AddPolicy("ApiScope", policy =>
                policy.RequireClaim("client_id", "secret"));

                options.AddPolicy("UserSecure", policy =>
                policy.RequireClaim("roleType", "userCode"));

                options.AddPolicy("AdminSecure", policy =>
                policy.RequireClaim("roleType", "adminCode"));
            });
}

这是正确的行为,您的 API 可以从 IdentityServer 离线工作。 API 只需要从 IdentityServer 下载签名密钥,API 默认情况下会将它们缓存 24 小时,以便验证它们是否有效。

您描述的问题已通过使用短期访问令牌(例如 1-10 分钟)解决?然后在客户端使用刷新令牌更新令牌。

或者您的 API 可以手动要求 token introspection endpoint 检查访问令牌是否仍然有效。