From c8b9e9e1b7f8d60f662cf7034362c5e6a6999519 Mon Sep 17 00:00:00 2001 From: Maarten Balliauw Date: Mon, 2 Mar 2026 21:49:09 +0100 Subject: [PATCH] Bump Duende.IdentityServer to 8.0.0-alpha.1 and update API calls to include cancellation tokens. --- src/DemoCorsPolicy.cs | 2 +- src/DemoRedirectValidator.cs | 4 ++-- src/Duende.IdentityServer.Demo.csproj | 2 +- src/Pages/Account/Create/Index.cshtml.cs | 4 ++-- src/Pages/Account/Login/Index.cshtml.cs | 12 ++++++------ src/Pages/Account/Logout/Index.cshtml.cs | 6 +++--- src/Pages/Account/Logout/LoggedOut.cshtml.cs | 2 +- src/Pages/Ciba/All.cshtml.cs | 2 +- src/Pages/Ciba/Consent.cshtml.cs | 10 +++++----- src/Pages/Ciba/Index.cshtml.cs | 2 +- src/Pages/Consent/Index.cshtml.cs | 10 +++++----- src/Pages/Device/Index.cshtml.cs | 10 +++++----- src/Pages/ExternalLogin/Callback.cshtml.cs | 4 ++-- src/Pages/Grants/Index.cshtml.cs | 10 +++++----- src/Pages/Home/Error/Index.cshtml.cs | 2 +- src/Pages/ServerSideSessions/Index.cshtml.cs | 4 ++-- 16 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/DemoCorsPolicy.cs b/src/DemoCorsPolicy.cs index 0119f19..f5076b6 100644 --- a/src/DemoCorsPolicy.cs +++ b/src/DemoCorsPolicy.cs @@ -6,7 +6,7 @@ namespace Duende.IdentityServer.Demo // allows arbitrary CORS origins - only for demo purposes. NEVER USE IN PRODUCTION public class DemoCorsPolicy : ICorsPolicyService { - public Task IsOriginAllowedAsync(string origin) + public Task IsOriginAllowedAsync(string origin, CancellationToken ct) { return Task.FromResult(true); } diff --git a/src/DemoRedirectValidator.cs b/src/DemoRedirectValidator.cs index 415ead1..3e62c26 100644 --- a/src/DemoRedirectValidator.cs +++ b/src/DemoRedirectValidator.cs @@ -7,12 +7,12 @@ namespace Duende.IdentityServer.Demo // allows arbitrary redirect URIs - only for demo purposes. NEVER USE IN PRODUCTION public class DemoRedirectValidator : IRedirectUriValidator { - public Task IsPostLogoutRedirectUriValidAsync(string requestedUri, Client client) + public Task IsRedirectUriValidAsync(string requestedUri, Client client) { return Task.FromResult(true); } - public Task IsRedirectUriValidAsync(string requestedUri, Client client) + public Task IsPostLogoutRedirectUriValidAsync(string requestedUri, Client client, CancellationToken ct) { return Task.FromResult(true); } diff --git a/src/Duende.IdentityServer.Demo.csproj b/src/Duende.IdentityServer.Demo.csproj index 9eaed1d..c8c4753 100644 --- a/src/Duende.IdentityServer.Demo.csproj +++ b/src/Duende.IdentityServer.Demo.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Pages/Account/Create/Index.cshtml.cs b/src/Pages/Account/Create/Index.cshtml.cs index e8f0093..14df8e1 100644 --- a/src/Pages/Account/Create/Index.cshtml.cs +++ b/src/Pages/Account/Create/Index.cshtml.cs @@ -41,7 +41,7 @@ public IActionResult OnGet(string? returnUrl) public async Task OnPost() { // check if we are in the context of an authorization request - var context = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl); + var context = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl, HttpContext.RequestAborted); // the user clicked the "cancel" button if (Input.Button != "create") @@ -51,7 +51,7 @@ public async Task OnPost() // if the user cancels, send a result back into IdentityServer as if they // denied the consent (even if this client does not require consent). // this will send back an access denied OIDC error response to the client. - await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied); + await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied, HttpContext.RequestAborted); // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null if (context.IsNativeClient()) diff --git a/src/Pages/Account/Login/Index.cshtml.cs b/src/Pages/Account/Login/Index.cshtml.cs index 2a0bf8b..be1403e 100644 --- a/src/Pages/Account/Login/Index.cshtml.cs +++ b/src/Pages/Account/Login/Index.cshtml.cs @@ -61,7 +61,7 @@ public async Task OnGet(string? returnUrl) public async Task OnPost() { // check if we are in the context of an authorization request - var context = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl); + var context = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl, HttpContext.RequestAborted); // the user clicked the "cancel" button if (Input.Button != "login") @@ -74,7 +74,7 @@ public async Task OnPost() // if the user cancels, send a result back into IdentityServer as if they // denied the consent (even if this client does not require consent). // this will send back an access denied OIDC error response to the client. - await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied); + await _interaction.DenyAuthorizationAsync(context, AuthorizationError.AccessDenied, HttpContext.RequestAborted); // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null if (context.IsNativeClient()) @@ -99,7 +99,7 @@ public async Task OnPost() if (_users.ValidateCredentials(Input.Username, Input.Password)) { var user = _users.FindByUsername(Input.Username); - await _events.RaiseAsync(new UserLoginSuccessEvent(user.Username, user.SubjectId, user.Username, clientId: context?.Client.ClientId)); + await _events.RaiseAsync(new UserLoginSuccessEvent(user.Username, user.SubjectId, user.Username, clientId: context?.Client.ClientId), HttpContext.RequestAborted); Telemetry.Metrics.UserLogin(context?.Client.ClientId, IdentityServerConstants.LocalIdentityProvider); // only set explicit expiration here if user chooses "remember me". @@ -152,7 +152,7 @@ public async Task OnPost() } const string error = "invalid credentials"; - await _events.RaiseAsync(new UserLoginFailureEvent(Input.Username, error, clientId:context?.Client.ClientId)); + await _events.RaiseAsync(new UserLoginFailureEvent(Input.Username, error, clientId:context?.Client.ClientId), HttpContext.RequestAborted); Telemetry.Metrics.UserLoginFailure(context?.Client.ClientId, IdentityServerConstants.LocalIdentityProvider, error); ModelState.AddModelError(string.Empty, LoginOptions.InvalidCredentialsErrorMessage); } @@ -169,7 +169,7 @@ private async Task BuildModelAsync(string? returnUrl) ReturnUrl = returnUrl }; - var context = await _interaction.GetAuthorizationContextAsync(returnUrl); + var context = await _interaction.GetAuthorizationContextAsync(returnUrl, HttpContext.RequestAborted); if (context?.IdP != null && await _schemeProvider.GetSchemeAsync(context.IdP) != null) { var local = context.IdP == Duende.IdentityServer.IdentityServerConstants.LocalIdentityProvider; @@ -200,7 +200,7 @@ private async Task BuildModelAsync(string? returnUrl) displayName: x.DisplayName ?? x.Name )).ToList(); - var dynamicSchemes = (await _identityProviderStore.GetAllSchemeNamesAsync()) + var dynamicSchemes = (await _identityProviderStore.GetAllSchemeNamesAsync(HttpContext.RequestAborted)) .Where(x => x.Enabled) .Select(x => new ViewModel.ExternalProvider ( diff --git a/src/Pages/Account/Logout/Index.cshtml.cs b/src/Pages/Account/Logout/Index.cshtml.cs index 61cb4e6..7dcf11e 100644 --- a/src/Pages/Account/Logout/Index.cshtml.cs +++ b/src/Pages/Account/Logout/Index.cshtml.cs @@ -41,7 +41,7 @@ public async Task OnGet(string? logoutId) } else { - var context = await _interaction.GetLogoutContextAsync(LogoutId); + var context = await _interaction.GetLogoutContextAsync(LogoutId, HttpContext.RequestAborted); if (context?.ShowSignoutPrompt == false) { // it's safe to automatically sign-out @@ -66,7 +66,7 @@ public async Task OnPost() // if there's no current logout context, we need to create one // this captures necessary info from the current logged in user // this can still return null if there is no context needed - LogoutId ??= await _interaction.CreateLogoutContextAsync(); + LogoutId ??= await _interaction.CreateLogoutContextAsync(HttpContext.RequestAborted); // delete local authentication cookie await HttpContext.SignOutAsync(); @@ -75,7 +75,7 @@ public async Task OnPost() var idp = User.FindFirst(JwtClaimTypes.IdentityProvider)?.Value; // raise the logout event - await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName())); + await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()), HttpContext.RequestAborted); Telemetry.Metrics.UserLogout(idp); // if it's a local login we can ignore this workflow diff --git a/src/Pages/Account/Logout/LoggedOut.cshtml.cs b/src/Pages/Account/Logout/LoggedOut.cshtml.cs index ba28a8d..ea6fe51 100644 --- a/src/Pages/Account/Logout/LoggedOut.cshtml.cs +++ b/src/Pages/Account/Logout/LoggedOut.cshtml.cs @@ -23,7 +23,7 @@ public LoggedOut(IIdentityServerInteractionService interactionService) public async Task OnGet(string? logoutId) { // get context information (client name, post logout redirect URI and iframe for federated signout) - var logout = await _interactionService.GetLogoutContextAsync(logoutId); + var logout = await _interactionService.GetLogoutContextAsync(logoutId, HttpContext.RequestAborted); View = new LoggedOutViewModel { diff --git a/src/Pages/Ciba/All.cshtml.cs b/src/Pages/Ciba/All.cshtml.cs index c8f65b5..713ec87 100644 --- a/src/Pages/Ciba/All.cshtml.cs +++ b/src/Pages/Ciba/All.cshtml.cs @@ -23,6 +23,6 @@ public AllModel(IBackchannelAuthenticationInteractionService backchannelAuthenti public async Task OnGet() { - Logins = await _backchannelAuthenticationInteraction.GetPendingLoginRequestsForCurrentUserAsync(); + Logins = await _backchannelAuthenticationInteraction.GetPendingLoginRequestsForCurrentUserAsync(HttpContext.RequestAborted); } } \ No newline at end of file diff --git a/src/Pages/Ciba/Consent.cshtml.cs b/src/Pages/Ciba/Consent.cshtml.cs index 2261356..2451de0 100644 --- a/src/Pages/Ciba/Consent.cshtml.cs +++ b/src/Pages/Ciba/Consent.cshtml.cs @@ -53,7 +53,7 @@ public async Task OnGet(string? id) public async Task OnPost() { // validate return url is still valid - var request = await _interaction.GetLoginRequestByInternalIdAsync(Input.Id ?? throw new ArgumentNullException(nameof(Input.Id))); + var request = await _interaction.GetLoginRequestByInternalIdAsync(Input.Id ?? throw new ArgumentNullException(nameof(Input.Id)), HttpContext.RequestAborted); if (request == null || request.Subject.GetSubjectId() != User.GetSubjectId()) { _logger.InvalidId(Input.Id); @@ -68,7 +68,7 @@ public async Task OnPost() result = new CompleteBackchannelLoginRequest(Input.Id); // emit event - await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); + await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues), HttpContext.RequestAborted); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName)); } // user clicked 'yes' - validate the data @@ -90,7 +90,7 @@ public async Task OnPost() }; // emit event - await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, result.ScopesValuesConsented, false)); + await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, result.ScopesValuesConsented, false), HttpContext.RequestAborted); Telemetry.Metrics.ConsentGranted(request.Client.ClientId, result.ScopesValuesConsented, false); var denied = request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName).Except(result.ScopesValuesConsented); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, denied); @@ -108,7 +108,7 @@ public async Task OnPost() if (result != null) { // communicate outcome of consent back to identityserver - await _interaction.CompleteLoginRequestAsync(result); + await _interaction.CompleteLoginRequestAsync(result, HttpContext.RequestAborted); return RedirectToPage("/Ciba/All"); } @@ -125,7 +125,7 @@ private async Task SetViewModelAsync(string? id) { ArgumentNullException.ThrowIfNull(id); - var request = await _interaction.GetLoginRequestByInternalIdAsync(id); + var request = await _interaction.GetLoginRequestByInternalIdAsync(id, HttpContext.RequestAborted); if (request != null && request.Subject.GetSubjectId() == User.GetSubjectId()) { View = CreateConsentViewModel(request); diff --git a/src/Pages/Ciba/Index.cshtml.cs b/src/Pages/Ciba/Index.cshtml.cs index f180fab..1652412 100644 --- a/src/Pages/Ciba/Index.cshtml.cs +++ b/src/Pages/Ciba/Index.cshtml.cs @@ -26,7 +26,7 @@ public IndexModel(IBackchannelAuthenticationInteractionService backchannelAuthen public async Task OnGet(string id) { - var result = await _backchannelAuthenticationInteraction.GetLoginRequestByInternalIdAsync(id); + var result = await _backchannelAuthenticationInteraction.GetLoginRequestByInternalIdAsync(id, HttpContext.RequestAborted); if (result == null) { _logger.InvalidBackchannelLoginId(id); diff --git a/src/Pages/Consent/Index.cshtml.cs b/src/Pages/Consent/Index.cshtml.cs index 203d4e7..53efebf 100644 --- a/src/Pages/Consent/Index.cshtml.cs +++ b/src/Pages/Consent/Index.cshtml.cs @@ -54,7 +54,7 @@ public async Task OnGet(string? returnUrl) public async Task OnPost() { // validate return url is still valid - var request = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl); + var request = await _interaction.GetAuthorizationContextAsync(Input.ReturnUrl, HttpContext.RequestAborted); if (request == null) return RedirectToPage("/Home/Error/Index"); ConsentResponse? grantedConsent = null; @@ -65,7 +65,7 @@ public async Task OnPost() grantedConsent = new ConsentResponse { Error = AuthorizationError.AccessDenied }; // emit event - await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); + await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues), HttpContext.RequestAborted); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName)); } // user clicked 'yes' - validate the data @@ -88,7 +88,7 @@ public async Task OnPost() }; // emit event - await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); + await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent), HttpContext.RequestAborted); Telemetry.Metrics.ConsentGranted(request.Client.ClientId, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent); var denied = request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName).Except(grantedConsent.ScopesValuesConsented); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, denied); @@ -108,7 +108,7 @@ public async Task OnPost() ArgumentNullException.ThrowIfNull(Input.ReturnUrl, nameof(Input.ReturnUrl)); // communicate outcome of consent back to identityserver - await _interaction.GrantConsentAsync(request, grantedConsent); + await _interaction.GrantConsentAsync(request, grantedConsent, HttpContext.RequestAborted); // redirect back to authorization endpoint if (request.IsNativeClient() == true) @@ -133,7 +133,7 @@ private async Task SetViewModelAsync(string? returnUrl) { ArgumentNullException.ThrowIfNull(returnUrl); - var request = await _interaction.GetAuthorizationContextAsync(returnUrl); + var request = await _interaction.GetAuthorizationContextAsync(returnUrl, HttpContext.RequestAborted); if (request != null) { View = CreateConsentViewModel(request); diff --git a/src/Pages/Device/Index.cshtml.cs b/src/Pages/Device/Index.cshtml.cs index 29cf3af..e869cf1 100644 --- a/src/Pages/Device/Index.cshtml.cs +++ b/src/Pages/Device/Index.cshtml.cs @@ -63,7 +63,7 @@ public async Task OnGet(string? userCode) public async Task OnPost() { - var request = await _interaction.GetAuthorizationContextAsync(Input.UserCode ?? throw new ArgumentNullException(nameof(Input.UserCode))); + var request = await _interaction.GetAuthorizationContextAsync(Input.UserCode ?? throw new ArgumentNullException(nameof(Input.UserCode)), HttpContext.RequestAborted); if (request == null) return RedirectToPage("/Home/Error/Index"); ConsentResponse? grantedConsent = null; @@ -77,7 +77,7 @@ public async Task OnPost() }; // emit event - await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues)); + await _events.RaiseAsync(new ConsentDeniedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues), HttpContext.RequestAborted); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName)); } // user clicked 'yes' - validate the data @@ -100,7 +100,7 @@ public async Task OnPost() }; // emit event - await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent)); + await _events.RaiseAsync(new ConsentGrantedEvent(User.GetSubjectId(), request.Client.ClientId, request.ValidatedResources.RawScopeValues, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent), HttpContext.RequestAborted); Telemetry.Metrics.ConsentGranted(request.Client.ClientId, grantedConsent.ScopesValuesConsented, grantedConsent.RememberConsent); var denied = request.ValidatedResources.ParsedScopes.Select(s => s.ParsedName).Except(grantedConsent.ScopesValuesConsented); Telemetry.Metrics.ConsentDenied(request.Client.ClientId, denied); @@ -118,7 +118,7 @@ public async Task OnPost() if (grantedConsent != null) { // communicate outcome of consent back to identityserver - await _interaction.HandleRequestAsync(Input.UserCode, grantedConsent); + await _interaction.HandleRequestAsync(Input.UserCode, grantedConsent, HttpContext.RequestAborted); // indicate that's it ok to redirect back to authorization endpoint return RedirectToPage("/Device/Success"); @@ -135,7 +135,7 @@ public async Task OnPost() private async Task SetViewModelAsync(string userCode) { - var request = await _interaction.GetAuthorizationContextAsync(userCode); + var request = await _interaction.GetAuthorizationContextAsync(userCode, HttpContext.RequestAborted); if (request != null) { View = CreateConsentViewModel(request); diff --git a/src/Pages/ExternalLogin/Callback.cshtml.cs b/src/Pages/ExternalLogin/Callback.cshtml.cs index 9635416..e6e8004 100644 --- a/src/Pages/ExternalLogin/Callback.cshtml.cs +++ b/src/Pages/ExternalLogin/Callback.cshtml.cs @@ -104,8 +104,8 @@ public async Task OnGet() var returnUrl = result.Properties.Items["returnUrl"] ?? "~/"; // check if external login is in the context of an OIDC request - var context = await _interaction.GetAuthorizationContextAsync(returnUrl); - await _events.RaiseAsync(new UserLoginSuccessEvent(provider, providerUserId, user.SubjectId, user.Username, true, context?.Client.ClientId)); + var context = await _interaction.GetAuthorizationContextAsync(returnUrl, HttpContext.RequestAborted); + await _events.RaiseAsync(new UserLoginSuccessEvent(provider, providerUserId, user.SubjectId, user.Username, true, context?.Client.ClientId), HttpContext.RequestAborted); Telemetry.Metrics.UserLogin(context?.Client.ClientId, provider!); if (context != null) diff --git a/src/Pages/Grants/Index.cshtml.cs b/src/Pages/Grants/Index.cshtml.cs index 051f00d..f8b1269 100644 --- a/src/Pages/Grants/Index.cshtml.cs +++ b/src/Pages/Grants/Index.cshtml.cs @@ -35,15 +35,15 @@ public Index(IIdentityServerInteractionService interaction, public async Task OnGet() { - var grants = await _interaction.GetAllUserGrantsAsync(); + var grants = await _interaction.GetAllUserGrantsAsync(HttpContext.RequestAborted); var list = new List(); foreach (var grant in grants) { - var client = await _clients.FindClientByIdAsync(grant.ClientId); + var client = await _clients.FindClientByIdAsync(grant.ClientId, HttpContext.RequestAborted); if (client != null) { - var resources = await _resources.FindResourcesByScopeAsync(grant.Scopes); + var resources = await _resources.FindResourcesByScopeAsync(grant.Scopes, HttpContext.RequestAborted); var item = new GrantViewModel() { @@ -73,8 +73,8 @@ public async Task OnGet() public async Task OnPost() { - await _interaction.RevokeUserConsentAsync(ClientId); - await _events.RaiseAsync(new GrantsRevokedEvent(User.GetSubjectId(), ClientId)); + await _interaction.RevokeUserConsentAsync(ClientId, HttpContext.RequestAborted); + await _events.RaiseAsync(new GrantsRevokedEvent(User.GetSubjectId(), ClientId), HttpContext.RequestAborted); Telemetry.Metrics.GrantsRevoked(ClientId); return RedirectToPage("/Grants/Index"); diff --git a/src/Pages/Home/Error/Index.cshtml.cs b/src/Pages/Home/Error/Index.cshtml.cs index be873ef..36d92ad 100644 --- a/src/Pages/Home/Error/Index.cshtml.cs +++ b/src/Pages/Home/Error/Index.cshtml.cs @@ -25,7 +25,7 @@ public Index(IIdentityServerInteractionService interaction, IWebHostEnvironment public async Task OnGet(string? errorId) { // retrieve error details from identityserver - var message = await _interaction.GetErrorContextAsync(errorId); + var message = await _interaction.GetErrorContextAsync(errorId, HttpContext.RequestAborted); if (message != null) { View.Error = message; diff --git a/src/Pages/ServerSideSessions/Index.cshtml.cs b/src/Pages/ServerSideSessions/Index.cshtml.cs index fbc7f78..06d59dc 100644 --- a/src/Pages/ServerSideSessions/Index.cshtml.cs +++ b/src/Pages/ServerSideSessions/Index.cshtml.cs @@ -46,7 +46,7 @@ public async Task OnGet() DisplayName = DisplayNameFilter, SessionId = SessionIdFilter, SubjectId = SubjectIdFilter - }); + }, HttpContext.RequestAborted); } } @@ -59,7 +59,7 @@ public async Task OnPost() await _sessionManagementService.RemoveSessionsAsync(new RemoveSessionsContext { SessionId = SessionId, - }); + }, HttpContext.RequestAborted); return RedirectToPage("/ServerSideSessions/Index", new { Token, DisplayNameFilter, SessionIdFilter, SubjectIdFilter, Prev }); } }