首页 文章

Identity Server刷新令牌资源所有者密码凭据流

提问于
浏览
3

我正在使用IdentityServer来控制对API的访问 . 我有一个单独的身份验证API,它会发出令牌并验证访问请求以保护API .

我让用户能够通过安全的Web应用程序生成访问令牌 . 我正在使用资源所有者密码凭据流 .

有没有办法在没有用户登录并请求的情况下发出刷新令牌?或者有没有办法设置初始访问令牌的到期时间?

Code

这是我用来生成令牌的代码 .

DiscoveryResponse disco = await DiscoveryClient.GetAsync("http://localhost:27144");
  TokenClient tokenClient = new TokenClient(disco.TokenEndpoint, "My Client", "MySecret");
  TokenResponse tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("testUser", "testPassword");

2 回答

  • 0

    是的,这可以通过刷新令牌来完成 .

    • 在客户端配置上设置 AllowOfflineAccess = true

    • 在初始令牌请求的范围内包含 offline_access

    除了AccessToken之外,令牌响应现在将包括RefreshToken . 将AccessToken返回给客户端并保持RefreshToken .

    当需要新的AccessToken时,请在TokenClient上使用RequestRefreshTokenAsync方法请求一个 . 名称令人困惑 - 您实际上是在从RefreshToken请求新的AccessToken .

    TokenResponse refreshTokenResponse = await tokenClient.RequestRefreshTokenAsync("RefreshTokenGoesHere");
    

    管理RefreshToken到期有两种方法 . 这由 RefreshTokenExpiration 属性控制:

    • 滑动过期

    • 绝对到期

    如果设置了滑动过期,则刷新令牌生存期将在每次刷新后更新 .

    还有一个 RefreshTokenUsage 属性,用于确定令牌's can be reused or are one-use only. If set to one-use only with sliding expiration, you' ll是否只需要一个新的RefreshToken来保持每个请求 .

    对于到期时间,有 SlidingRefreshTokenLifetimeAbsoluteRefreshTokenLifetime . 两者都可以同时使用 . 例如,如果启用了滑动刷新令牌,则滑动到期可能为30天,而绝对到期时间可能为1年 . 这将允许用户在需要再次登录之前30天不活动,但如果用户保持活动状态,则使用1年无需登录 .

    重要的是要注意,在所有情况下都不应该将RefreshToken返回给用户 - 只有访问令牌应该 . 您需要一些数据存储机制来保留刷新令牌及其到期日期 .

  • 5

    我支持kg743的答案,但对于任何其他人,我相信我可以省去一些麻烦:

    使用空格包含范围,如下所示:

    Scopes = "scope1 scope2 offline_access scope3"
    

    我一直用逗号(,)或分号(;)包括它,它对我不起作用 .

相关问题