IdentityServer 4で.netコアを使用しています。WebAPIと、API上の安全なエンドポイントにアクセスするMVCアプリがあります。セットアップはIdentityServerクイックスタートと非常によく似ています。
https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity
access_tokens
の有効期限が切れているようです。refresh_tokens
の再交渉方法を知りたいのですが。
次のコードを例にとります(クイックスタート here から取得):
public async Task<IActionResult> CallApiUsingUserAccessToken()
{
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:5001/identity");
ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
access_token
が期限切れの場合、401応答で失敗します。 access_token
を使用してrefresh_token
を再ネゴシエートするための組み込みメカニズムはありますか?
access_token
を更新するための組み込みシステムはありません。ただし、IdentityModel
パッケージを使用して、access_token
で新しいrefresh_token
をリクエストできます。
Client
には、IdentityServerでtrueに設定する必要があるプロパティAllowOfflineAccess
があります。これは、暗黙的/クライアント資格情報フローでは機能しません機能しません。
access_token
の有効期限を確認し、access_token
(個人設定)を使用して新しいrefresh_token
を要求することにより、期限切れが近いかどうかを確認します。access_token
とrefresh_token
このコードの前に、新しいaccess_token
をリクエストする前に、access_token
の有効期間を確認したり、このコードをサービスにラップしたりできます。
var discoveryResponse = await DiscoveryClient.GetAsync("IdentityServer url");
if (discoveryResponse.IsError)
{
throw new Exception(discoveryResponse.Error);
}
var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "ClientId", "ClientSecret");
// This will request a new access_token and a new refresh token.
var tokenResponse = await tokenClient.RequestRefreshTokenAsync(await httpContext.Authentication.GetTokenAsync("refresh_token"));
if (tokenResponse.IsError)
{
// Handle error.
}
var oldIdToken = await httpContext.Authentication.GetTokenAsync("id_token");
var tokens = new List<AuthenticationToken>
{
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.IdToken,
Value = oldIdToken
},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.AccessToken,
Value = tokenResult.AccessToken
},
new AuthenticationToken
{
Name = OpenIdConnectParameterNames.RefreshToken,
Value = tokenResult.RefreshToken
}
};
var expiresAt = DateTime.UtcNow.AddSeconds(tokenResult.ExpiresIn);
tokens.Add(new AuthenticationToken
{
Name = "expires_at",
Value = expiresAt.ToString("o", CultureInfo.InvariantCulture)
});
// Sign in the user with a new refresh_token and new access_token.
var info = await httpContext.Authentication.GetAuthenticateInfoAsync("Cookies");
info.Properties.StoreTokens(tokens);
await httpContext.Authentication.SignInAsync("Cookies", info.Principal, info.Properties);
から取られ、わずかに変更されました: Source