Browse Source

Refactor token expiration handling in cookie auth options

pull/24526/head
maliming 9 months ago
parent
commit
71bc239f88
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 26
      framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs

26
framework/src/Volo.Abp.AspNetCore/Microsoft/Extensions/DependencyInjection/CookieAuthenticationOptionsExtensions.cs

@ -14,7 +14,7 @@ namespace Microsoft.Extensions.DependencyInjection;
public static class CookieAuthenticationOptionsExtensions public static class CookieAuthenticationOptionsExtensions
{ {
/// <summary> /// <summary>
/// Check the access_token is expired or inactive. /// Check if the access_token is expired or inactive.
/// </summary> /// </summary>
public static CookieAuthenticationOptions CheckTokenExpiration(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc", TimeSpan? advance = null, TimeSpan? validationInterval = null) public static CookieAuthenticationOptions CheckTokenExpiration(this CookieAuthenticationOptions options, string oidcAuthenticationScheme = "oidc", TimeSpan? advance = null, TimeSpan? validationInterval = null)
{ {
@ -25,6 +25,7 @@ public static class CookieAuthenticationOptionsExtensions
{ {
if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated) if (principalContext.Principal == null || principalContext.Principal.Identity == null || !principalContext.Principal.Identity.IsAuthenticated)
{ {
await InvokePreviousHandlerAsync(principalContext, previousHandler);
return; return;
} }
@ -35,7 +36,7 @@ public static class CookieAuthenticationOptionsExtensions
expiresAt <= DateTimeOffset.UtcNow.Add(advance.Value)) expiresAt <= DateTimeOffset.UtcNow.Add(advance.Value))
{ {
logger.LogInformation("The access_token expires within {AdvanceSeconds}s; signing out.", advance.Value.TotalSeconds); logger.LogInformation("The access_token expires within {AdvanceSeconds}s; signing out.", advance.Value.TotalSeconds);
await SignOutAsync(principalContext); await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler);
return; return;
} }
@ -56,6 +57,7 @@ public static class CookieAuthenticationOptionsExtensions
if (introspectionEndpoint.IsNullOrWhiteSpace()) if (introspectionEndpoint.IsNullOrWhiteSpace())
{ {
logger.LogWarning("No introspection endpoint configured. Skipping token activity check."); logger.LogWarning("No introspection endpoint configured. Skipping token activity check.");
await InvokePreviousHandlerAsync(principalContext, previousHandler);
return; return;
} }
@ -70,14 +72,14 @@ public static class CookieAuthenticationOptionsExtensions
if (response.IsError) if (response.IsError)
{ {
logger.LogError("Token introspection error: {Error}", response.Error); logger.LogError("Token introspection error: {Error}", response.Error);
await SignOutAsync(principalContext); await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler);
return; return;
} }
if (!response.IsActive) if (!response.IsActive)
{ {
logger.LogError("The access_token is not active."); logger.LogError("The access_token is not active.");
await SignOutAsync(principalContext); await SignOutAndInvokePreviousHandlerAsync(principalContext, previousHandler);
return; return;
} }
@ -91,10 +93,7 @@ public static class CookieAuthenticationOptionsExtensions
} }
} }
if (previousHandler != null) await InvokePreviousHandlerAsync(principalContext, previousHandler);
{
await previousHandler(principalContext);
}
}; };
return options; return options;
@ -117,4 +116,15 @@ public static class CookieAuthenticationOptionsExtensions
principalContext.RejectPrincipal(); principalContext.RejectPrincipal();
await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name); await principalContext.HttpContext.SignOutAsync(principalContext.Scheme.Name);
} }
private static Task InvokePreviousHandlerAsync(CookieValidatePrincipalContext principalContext, Func<CookieValidatePrincipalContext, Task>? previousHandler)
{
return previousHandler != null ? previousHandler(principalContext) : Task.CompletedTask;
}
private static async Task SignOutAndInvokePreviousHandlerAsync(CookieValidatePrincipalContext principalContext, Func<CookieValidatePrincipalContext, Task>? previousHandler)
{
await SignOutAsync(principalContext);
await InvokePreviousHandlerAsync(principalContext, previousHandler);
}
} }

Loading…
Cancel
Save