Identity Server 4 で OpenID Connect を使用している ASP.net コア 3.1 MVC アプリケーションがあります。IdentityModel を使用して、アプリケーションのアクセス トークンを自動的に更新しています。構成は次のようになります。
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.SlidingExpiration = false;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://localhost:5001";
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code";
options.SaveTokens = true;
options.Scope.Add("profile");
options.Scope.Add("api1");
options.Scope.Add("offline_access");
options.GetClaimsFromUserInfoEndpoint = true;
options.SignedOutCallbackPath = "/oidc-signout";
options.SignedOutRedirectUri = "/goodbye";
});
services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
});
services.AddHttpClient("api1", configure =>
{
configure.BaseAddress = new Uri("https://localhost:6001");
});
services.AddAccessTokenManagement();
その ID サーバーを使用して保護されているダウンストリーム API からデータをプルするコントローラーがあります。私の MVC クライアントは、更新トークンを取得するためにスコープ api1 と offline_access を要求します。これらのトークンはSaveTokens = true
、サービスに設定されているため、Cookie に保存されます。
すべてが正常に機能しています。ログインすると、アクセス トークンとリフレッシュ トークンを取得します。アクセス トークンを約 20 分間保持し、有効期限が切れると、更新トークンを使用してトークン エンドポイントを呼び出し、新しいアクセス トークンと更新トークンを取得します。
対処方法がわからないシナリオの 1 つは、リフレッシュ トークンの有効期間が過ぎた場合です。リフレッシュ トークンの有効期間を 8 時間に設定しても、MVC セッションがまだアクティブな場合、新しいリフレッシュ トークンを取得しようとして失敗します。
この更新トークンの取得に失敗したときにそれを検出する、処理できる OpenID 接続ミドルウェアのイベントがあり、それを使用して何らかの方法でログイン (または少なくとも ID サーバー /authorize エンドポイントへの往復) を強制することはできますか?