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

时间:2017-05-09 18:28:55

标签: c# asp.net-mvc oauth-2.0 openid-connect identityserver4

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

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

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

代码

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

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 :(得分:6)

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

  • 在客户端配置
  • 上设置AllowOfflineAccess = true
  • 在初始令牌请求的范围内包含offline_access

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

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

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

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

  • 滑动过期
  • 绝对过期

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

还有一个RefreshTokenUsage属性,用于确定令牌是否可以重复使用或仅用于一次。如果设置为仅使用滑动到期时,您只需获取一个新的RefreshToken来保持每个请求。

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

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

答案 1 :(得分:0)

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

在范围内添加空格,如下所示:

Scopes = "scope1 scope2 offline_access scope3"

我一直用逗号(,)或分号(;)包含它,但对我来说不起作用。