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