當用戶 "註銷" IdentityServer並且他們使用 "外部身份提供程式" 登錄時,可能會將其重定向到註銷外部提供程式。並非所有外部提供商都支持註銷,因為它取決於它們支持的協議和功能。 要檢測是否必須將用戶重定向到外部身份提供程式以進行註銷通常是通過使用 在IdentityServer中發佈到 ...
當用戶註銷 IdentityServer並且他們使用外部身份提供程式登錄時,可能會將其重定向到註銷外部提供程式。並非所有外部提供商都支持註銷,因為它取決於它們支持的協議和功能。
要檢測是否必須將用戶重定向到外部身份提供程式以進行註銷通常是通過使用idp
在IdentityServer中發佈到cookie中的聲明來完成的。設置到此聲明中的值是AuthenticationScheme
相應的身份驗證中間件。在簽出時,咨詢此聲明以瞭解是否需要外部簽出。
由於正常註銷工作流程已經需要清理和狀態管理,因此將用戶重定向到外部身份提供商是有問題的。然後,在IdentityServer完成正常註銷和清理過程的唯一方法是從外部身份提供程式請求在註銷後將用戶重定向回IdentityServer。並非所有外部提供商都支持退出後重定向,因為它取決於它們支持的協議和功能。
然後,註銷的工作流程將撤消IdentityServer的身份驗證cookie,然後重定向到請求註銷後重定向的外部提供程式。退出後重定嚮應保持此處描述的必要簽出狀態(即logoutId
參數值)。要在外部提供程式註銷後重定向回IdentityServer,RedirectUri
應該AuthenticationProperties在使用ASP.NET Core的SignOutAsyncAPI
時使用,例如:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutInputModel model)
{
// build a model so the logged out page knows what to display
var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId);
var user = HttpContext.User;
if (user?.Identity.IsAuthenticated == true)
{
// delete local authentication cookie
await HttpContext.SignOutAsync();
// raise the logout event
await _events.RaiseAsync(new UserLogoutSuccessEvent(user.GetSubjectId(), user.GetName()));
}
// check if we need to trigger sign-out at an upstream identity provider
if (vm.TriggerExternalSignout)
{
// build a return URL so the upstream provider will redirect back
// to us after the user has logged out. this allows us to then
// complete our single sign-out processing.
string url = Url.Action("Logout", new { logoutId = vm.LogoutId });
// this triggers a redirect to the external provider for sign-out
return SignOut(new AuthenticationProperties { RedirectUri = url }, vm.ExternalAuthenticationScheme);
}
return View("LoggedOut", vm);
}
一旦用戶退出外部提供程式然後重定向回來,IdentityServer的正常註銷處理應該執行,這涉及處理logoutId
和執行所有必要的清理。