[英]How to get Refresh token by calling Authorization endpoint on Identity server 4
我有 ASP.Net MVC 客戶端應用程序、API.Net Web API 2 項目和身份服務器 4。我想保護我的 API 免受未經授權的訪問,因此我從 IS4 獲取 JWT 令牌,然后在制作時將標頭作為承載令牌傳遞對 API 的調用。 所有這些工作正常(登錄到應用程序,獲取 JWT 令牌,然后傳遞給 API,以便在授權令牌后調用它)。 我正在使用 IdentityModel 3.9.0 版本與身份服務器 4 端點進行交互。
我正在嘗試從身份服務器 4 獲取刷新令牌,這就是問題所在。 我無法通過調用授權端點來獲取它。 我在那里很困惑。 下面是我在配置文件中的文件 IS4 GetClients 方法
我正在使用 HybridAndClientCredentials,然后發現使用客戶端憑據不支持刷新令牌流。
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
AccessTokenLifetime = 1800,
AllowOfflineAccess = true,
// secret for authentication
ClientSecrets =
{
new Secret("secret".Sha256())
},
// scopes that client has access to
AllowedScopes = { "nidhiapi", "offline_access" }
}
};
我剛剛創建了一個 Basic 控制台應用程序來測試我的身份驗證服務器,下面是 main 方法中的代碼
var discoveryClient = await DiscoveryClient.GetAsync("http://localhost:5000/");
if (discoveryClient.IsError)
{
Console.WriteLine(discoveryClient.Error);
return;
}
// request the token from the Auth server
var tokenClient = new TokenClient(discoveryClient.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("nidhiapi");
我能夠使用定義的客戶端和 HybridClientCredentials 流在 tokenResponse 變量中獲取 AccessToken
因為我想從 Authorize 端點獲取 RefreshToken。 我嘗試使用相同的 GetClients 方法更改我的客戶端代碼
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("offline_access");
使用上面的代碼行我得到一個錯誤為“Invalid_Scope”。 我閱讀了它,發現我們需要使用 offline_access 來獲取刷新令牌
另外,我還有一個問題。 當我試圖為此找出解決方案時,我想到了使用 AuthorizeEndPoint 創建一個 tokenClient 但除非我驗證我的客戶端憑據,否則下面的語句是沒有用的。
還有一件事:我應該在 RequestRefreshToken 方法中傳遞什么,因為它需要一個令牌
var authTokenClient = new TokenClient(discoveryClient.AuthorizeEndpoint, "client", "secret");
var refreshTokenResponse = await tokenClient.RequestRefreshTokenAsync("offline_access");
然后我嘗試將我的 GetClients 方法更改為僅使用混合流而不使用 HybridClientCredentials,因為我還了解到 RefreshToken 流不適用於 ClientCredentials。
其實我現在很迷茫。 我的要求是從 IS4 獲取令牌,然后使用刷新令牌刷新它,以便 MVC 客戶端應用程序不必在到期時登錄
建議/解決方案,好嗎?
需要使用授權碼流,需要請求“openid offline_access”作用域。 據我所知,您只能在使用授權代碼流時使用刷新令牌。
希望這可以幫助。
已經有一段時間了,但我相信我的回答會對某人有所幫助。 要在 ID4 中獲取刷新令牌以及訪問令牌,您需要在客戶端范圍內和請求令牌時指定 offline_access。 讓我們以基於用戶名/密碼的令牌生成為例。 客戶端應該是這樣的
Client
{
ClientId = clientName,
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
RequireClientSecret = false,
AllowedScopes = { apiResourceName, "offline_access" },
AllowOfflineAccess = true,
AccessTokenLifetime = 63113904,
IdentityTokenLifetime = 63113904,
RefreshTokenExpiration = TokenExpiration.Sliding,
SlidingRefreshTokenLifetime = 63113904
}
此后,當您調用身份服務器時,您必須使用 apiResourceName 和 offline_access 定義范圍,以生成刷新令牌和訪問令牌。 要生成訪問/刷新令牌,使用用戶名/密碼,您可以執行以下操作
var response = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
Address = "http://locahost/connect/token",
ClientId = Enumerations.Client,
Scope = Enumerations.API+" offline_access",
UserName = "username",
Password = "password"
});
現在,您將填充 response.RefreshToken 和 response.AccessToken。 如果您不指定offline_score,您只會在刷新令牌中獲得空值。
現在下一部分是如何使用刷新令牌生成新的訪問令牌。 這是更簡單的部分,您只需要再次調用 /connect/token 但使用刷新令牌,這就是您需要做的全部。 這是來自身份服務器文檔
POST /connect/token
client_id=client&
client_secret=secret&
grant_type=refresh_token&
refresh_token=hdh922
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.