2017-05-09 45 views
0

我使用IdentityServer來控制訪問的API。我有一個單獨的身份驗證API,它發佈令牌並驗證訪問請求以確保API的安全。Identity Server的刷新令牌資源所有者密碼憑據流

我給用戶通過安全的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"); 
+0

能否請您提供更多的信息?如果你設置'AllowOfflineAccess = True',IdentityServer會自動返回'refresh_token'。你也可以設置'AccessTokenLifetime' ... – moritzg

+0

@moritzg我將allowOfflineAccess標誌設置爲true,並將absoluteRefreshTokenLifetime設置爲31540000,這應該是一年。但是,令牌響應對象爲expiresIn屬性返回3600。我可以看到refresh_token也被返回。我是否在授權標題中傳遞了該信息? –

+0

你是指「令牌響應對象」的意思嗎? – moritzg

回答

1

是的,這可以用刷新令牌來完成。

  • AllowOfflineAccess = true上的客戶端的配置
  • 包括在初始令牌請求

範圍令牌響應現在將包括一個RefreshToken除的accessToken offline_access。將AccessToken返回給客戶端並保持RefreshToken。

當需要新的AccessToken時,使用TokenClient上的RequestRefreshTokenAsync方法請求一個。該名稱令人困惑 - 您實際上是從RefreshToken請求一個新的AccessToken。

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

有管理RefreshToken到期的兩種方式。這是由RefreshTokenExpiration屬性控制:

  • 滑動過期
  • 絕對過期

如果滑動過期設置,刷新令牌壽命將每次刷新後續約。

還有一個RefreshTokenUsage屬性,它確定令牌是否可以重複使用或者只能使用一次。如果設置爲僅使用滑動到期一次,則只需獲取一個新的RefreshToken以保留每個請求。

對於到期時間,有SlidingRefreshTokenLifetimeAbsoluteRefreshTokenLifetime。兩者都可以同時使用。例如,如果啓用了滑動刷新令牌,則滑動到期可能爲30天,而絕對到期可能爲1年。這將允許用戶在需要再次登錄之前30天不活動,但如果用戶保持活動狀態,則可以免費登錄1年。

重要的是要注意,在所有情況下,RefreshToken都不應該返回給用戶 - 只有訪問令牌應該。您需要一些數據存儲機制來保存刷新令牌及其到期日期。

+0

#Kevin Gysberg我們如何通過apiname將offline_access傳遞給作用域 –

相關問題