/// <summary> /// Removes the account associated with context.HttpContext.User from the MSAL.NET cache. /// </summary> /// <param name="context">RedirectContext passed-in to a <see cref="OpenIdConnectEvents.OnRedirectToIdentityProviderForSignOut"/> /// OpenID Connect event.</param> /// <returns>A <see cref="Task"/> that represents a completed account removal operation.</returns> public async Task RemoveAccountAsync(RedirectContext context) { ClaimsPrincipal user = context.HttpContext.User; string? userId = user.GetMsalAccountId(); if (!string.IsNullOrEmpty(userId)) { IConfidentialClientApplication app = await GetOrBuildConfidentialClientApplicationAsync().ConfigureAwait(false); if (_microsoftIdentityOptions.IsB2C) { await _tokenCacheProvider.ClearAsync(userId).ConfigureAwait(false); } else { string? identifier = context.HttpContext.User.GetMsalAccountId(); IAccount account = await app.GetAccountAsync(identifier).ConfigureAwait(false); if (account != null) { await app.RemoveAsync(account).ConfigureAwait(false); await _tokenCacheProvider.ClearAsync(userId).ConfigureAwait(false); } } } }
/// <summary> /// Removes the account associated with context.HttpContext.User from the MSAL.NET cache. /// </summary> /// <param name="context">RedirectContext passed-in to a <see cref="OpenIdConnectEvents.OnRedirectToIdentityProviderForSignOut"/> /// OpenID Connect event.</param> /// <returns>A <see cref="Task"/> that represents a completed account removal operation.</returns> public async Task RemoveAccountAsync(RedirectContext context) { ClaimsPrincipal user = context.HttpContext.User; string? userId = user.GetMsalAccountId(); if (!string.IsNullOrEmpty(userId)) { IConfidentialClientApplication app = await GetOrBuildConfidentialClientApplicationAsync().ConfigureAwait(false); // For B2C, we should remove all accounts of the user regardless the user flow if (_microsoftIdentityOptions.IsB2C) { var b2cAccounts = await app.GetAccountsAsync().ConfigureAwait(false); foreach (var b2cAccount in b2cAccounts) { await app.RemoveAsync(b2cAccount).ConfigureAwait(false); } await _tokenCacheProvider.ClearAsync(userId).ConfigureAwait(false); } else { string? identifier = context.HttpContext.User.GetMsalAccountId(); IAccount account = await app.GetAccountAsync(identifier).ConfigureAwait(false); if (account != null) { await app.RemoveAsync(account).ConfigureAwait(false); await _tokenCacheProvider.ClearAsync(userId).ConfigureAwait(false); } } } }
/// <summary> /// Removes the account associated with context.HttpContext.User from the MSAL.NET cache. /// </summary> /// <param name="context">RedirectContext passed-in to a <see cref="OpenIdConnectEvents.OnRedirectToIdentityProviderForSignOut"/> /// Openidconnect event.</param> /// <returns></returns> public async Task RemoveAccountAsync(RedirectContext context) { ClaimsPrincipal user = context.HttpContext.User; IConfidentialClientApplication app = await GetOrBuildConfidentialClientApplicationAsync().ConfigureAwait(false); IAccount account = null; // For B2C, we should remove all accounts of the user regardless the user flow if (_microsoftIdentityOptions.IsB2C) { var b2cAccounts = await app.GetAccountsAsync().ConfigureAwait(false); foreach (var b2cAccount in b2cAccounts) { await app.RemoveAsync(b2cAccount).ConfigureAwait(false); } _tokenCacheProvider?.ClearAsync().ConfigureAwait(false); } else { account = await app.GetAccountAsync(context.HttpContext.User.GetMsalAccountId()).ConfigureAwait(false); // Workaround for the guest account if (account == null) { var accounts = await app.GetAccountsAsync().ConfigureAwait(false); account = accounts.FirstOrDefault(a => a.Username == user.GetLoginHint()); } if (account != null) { await app.RemoveAsync(account).ConfigureAwait(false); _tokenCacheProvider?.ClearAsync().ConfigureAwait(false); } } }
/// <summary> /// Removes the account associated with context.HttpContext.User from the MSAL.NET cache /// </summary> /// <param name="context">RedirectContext passed-in to a <see cref="OnRedirectToIdentityProviderForSignOut"/> /// Openidconnect event</param> /// <returns></returns> public async Task RemoveAccountAsync(RedirectContext context) { ClaimsPrincipal user = context.HttpContext.User; IConfidentialClientApplication app = GetOrBuildConfidentialClientApplication(); IAccount account = await app.GetAccountAsync(context.HttpContext.User.GetMsalAccountId()).ConfigureAwait(false); // Workaround for the guest account if (account == null) { var accounts = await app.GetAccountsAsync().ConfigureAwait(false); account = accounts.FirstOrDefault(a => a.Username == user.GetLoginHint()); } if (account != null) { await app.RemoveAsync(account).ConfigureAwait(false); _tokenCacheProvider?.ClearAsync().ConfigureAwait(false); } }