Can';无法获取IdentityServer4注销以进行外部(Google)身份验证

Can';无法获取IdentityServer4注销以进行外部(Google)身份验证,identityserver4,Identityserver4,我正在通过IdentityServer4 quickstart进行工作,并试图让外部(Google)身份验证正常工作。我可以通过谷歌登录,但在登录之后,即使我点击“注销”,我也会在接下来的时间自动进入 以下是AccountController.cs的注销逻辑 /// <summary> /// Handle logout page postback /// </summary> [HttpPost] [ValidateAntiForgeryToken] public as

我正在通过IdentityServer4 quickstart进行工作,并试图让外部(Google)身份验证正常工作。我可以通过谷歌登录,但在登录之后,即使我点击“注销”,我也会在接下来的时间自动进入

以下是AccountController.cs的注销逻辑

/// <summary>
/// Handle logout page postback
/// </summary>
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutInputModel model)
{
    // build a model so the logged out page knows what to display
    var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);

    if (User?.Identity.IsAuthenticated == true)
    {
        // delete local authentication cookie
        await _signInManager.SignOutAsync();

        // raise the logout event
        await _events.RaiseAsync(new UserLogoutSuccessEvent(User.GetSubjectId(), User.GetDisplayName()));
    }

    // 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);
}
//
///句柄注销页回发
/// 
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务注销(LogoutInputModel)
{
//构建一个模型,以便注销页面知道要显示什么
var vm=await BuildLoggedOutViewModelAsync(model.LogoutId);
if(User?.Identity.IsAuthenticated==true)
{
//删除本地身份验证cookie
等待_signInManager.SignOutAsync();
//引发注销事件
wait_events.RaiseAsync(新用户logoutSuccessEvent(User.GetSubjectId(),User.GetDisplayName());
}
//检查是否需要在上游身份提供商处触发注销
if(vm.TriggerExternalSignot)
{
//构建一个返回URL,以便上游提供程序将重定向回
//在用户注销后发送给我们。这允许我们
//完成我们的单一注销处理。
字符串url=url.Action(“注销”,新的{logoutId=vm.logoutId});
//这将触发重定向到外部提供程序以进行注销
返回注销(新的AuthenticationProperties{RedirectUri=url},vm.ExternalAuthenticationScheme);
}
返回视图(“LoggedOut”,vm);
}
顺便说一下,我的内部身份验证登录和注销工作正常。有人能告诉我我在这里遗漏了什么吗

更新-1

进一步调试表明,注销函数中的vm.triggerExternalSignot值在注销时始终为false。变量TriggerExternalSignout在整个解决方案的源代码中仅出现两次。第一个在上面的注销中,另一个在LoggedOutViewModel.cs中,如下所示:

TriggerExternalSignout为false的直接原因是属性ExternalAuthenticationScheme的值始终为null。ExternalAuthenticationScheme获取集的唯一位置是AccountController的BuildLoggedOutViewModelAsync函数(请参见下面的屏幕截图),在登录和注销期间,该函数似乎从未被调用(断点从未被命中)

这是因为providerSupportsSignout的值为false。这是有道理的,因为谷歌不支持注销,但我应该怎么做才能使我的注销工作

更新-2

我在BuildLoggedOutViewModelAsync函数中添加了注销逻辑,如nahidf在其回答中所建议的,如下所示:

不幸的是,注销似乎仍然不起作用-我在从谷歌登录中单击注销后进入页面,页面上说我已注销,但当我尝试启动新会话时,我仍然通过单击谷歌登录按钮直接登录

我做错了什么?

  • 检查您的案例中的
    TriggerExternalSignot
    是否为
    true
    ,如果不是,应调查原因
  • 如果
    TriggerExternalSignout
    已为真,请尝试
当我们从IdentityServer4注销时,它只是将用户从应用程序注销。它将而不是将用户从其Google帐户注销。谷歌不支持第三方注销


编辑:对于谷歌案例,
TriggerExternalSignot
false
,因为谷歌不支持外部注销

谢谢你!我确实注意到TriggerExternalSignout值为false,我目前正试图找出原因…您使用的是哪个版本的Ids4?IdentityServer 4.0.0、.Net Core 3.1.nahidf,请看我上面的新更新-我刚刚添加了您推荐的代码(几乎是硬编码的!只是想看看结果)。但这似乎没有什么区别。有什么想法吗?再次感谢!看来我能重新开始谷歌认证会话(登录页面)的唯一方法就是使用浏览器删除浏览数据。
   // delete local authentication cookie
  await HttpContext.SignOutAsync();

  // Clear the existing external cookie to ensure a clean login process
  wait HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme);

  // Clear the existing external cookie to ensure a clean login process
  await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);