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