【问题标题】:Identity Server 4 token expiration Api vs ClientAppIdentity Server 4 令牌过期 API 与 ClientApp
【发布时间】:2020-08-05 10:00:34
【问题描述】:

我目前正在构建一个具有身份验证/授权的 WebApp 来访问它并访问多个 WebAPI,所有这些都指向 Identity Server 4 主机。 我遵循了 IdentityServer4 的官方文档及其演示以及客户端身份验证、令牌生成、用户登录、使用令牌成功调用 API,显然一切正常,但最近我注意到,在一段时间不活动后,调用API 开始接收 401,但客户端应用程序仍然使用相同的令牌。

是这样的:

  1. 启动带有调试功能的浏览器
  2. 使用某些用户登录
  3. 转到调用一个 API 为其检索数据的视图
  4. 继续导航和测试,其他一切正常

现在,问题(在前面的第 4 步之后)

  1. 停止调试但保持浏览器正常运行(保持 cookie)
  2. 更改代码,实现新东西(基本上是打发时间)
  3. 再次启动调试
  4. 在已经打开的浏览器上使用相同的会话/cookie,尝试在应用程序上导航可以正常工作,并且不需要重新登录
  5. 导航到将使用当前令牌调用 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


    【解决方案1】:

    为什么在调用 API 时相同的令牌适用于 ClientApp 没有?

    两件事:

    1. 访问令牌的过期时间与您的操作无关。

    JWT 令牌一旦发出就无法更改。默认情况下,令牌会在 3600 秒后过期。

    1. 应用和api的区别:应用使用cookies,api是bearer token。

    cookie 有自己的过期逻辑。这意味着它在不同的时间过期,与访问令牌的过期时间无关,并且也可以保持活动状态,因为 cookie 可以更新,这与 JWT 访问令牌不同。

    对于offline_access,您需要使用刷新令牌获取新的访问令牌。正如here所解释的那样。

    【讨论】:

    • 您好,感谢@ruard-van-elburg 的回复,您解释的差异是有道理的。我查看了您提供的链接(没有找到我的搜索)。欢呼
    猜你喜欢
    • 2017-06-29
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多