簡體   English   中英

如何通過在身份服務器 4 上調用授權端點來獲取刷新令牌

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM