繁体   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