C# 如果用户使用Google登录,ASP.NET Core Identity 2.0 SignoutAsync不会注销用户

C# 如果用户使用Google登录,ASP.NET Core Identity 2.0 SignoutAsync不会注销用户,c#,asp.net-core,asp.net-core-2.0,asp.net-core-identity,C#,Asp.net Core,Asp.net Core 2.0,Asp.net Core Identity,我已安装并运行Asp.net Core Identity 2.0版。我发现,\u signinManager.SignoutAsync在用户登录Google后不会注销用户。当我返回到我的登录方法时,它只显示用户已登录,并且他们的声明对象仍然完好无损 代码非常简单,如下所示 [AllowAnonymous] public ActionResult TestGoogle() { var redirectUrl = Url.Action(nameof(ExternalCallback), "A

我已安装并运行Asp.net Core Identity 2.0版。我发现,
\u signinManager.SignoutAsync
在用户登录Google后不会注销用户。当我返回到我的登录方法时,它只显示用户已登录,并且他们的声明对象仍然完好无损

代码非常简单,如下所示

[AllowAnonymous]
public ActionResult TestGoogle()
{
    var redirectUrl = Url.Action(nameof(ExternalCallback), "Account", new { ReturnUrl = "" });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties("Google", redirectUrl);
    return Challenge(properties, "Google");
}


public async Task<IActionResult> LogOff()
{
    await _signInManager.SignOutAsync();
    return RedirectToAction(nameof(HomeController.Index), "Home");
}
[AllowAnonymous]
公共行动结果测试Google()
{
var redirectUrl=Url.Action(nameof(ExternalCallback),“Account”,new{ReturnUrl=”“});
var properties=\u signInManager.ConfigureExternalAuthenticationProperties(“Google”,重定向URL);
返回挑战(属性,“谷歌”);
}
公共异步任务注销()
{
等待_signInManager.SignOutAsync();
返回重定向到操作(nameof(HomeController.Index),“Home”);
}

问题在于,您的
重定向到操作
覆盖了对
SignOutAsync
发出的Identity Server endsession URL的重定向

至于
SignOutAsync
,过时的是
Authentication
部分——从ASP.NET Core 2.0开始,它是直接脱离
HttpContext
本身的扩展

(对于相同的注销问题,微软的HaoK给出了相同的解释。)

编辑:解决方案是在
AuthenticationProperties
对象中发送一个重定向URL,并使用最终的
SignOutAsync

//在某些控制器/处理程序中,请注意“bare”任务返回值
公共异步任务LogoutAction()
{
//注销后,我们将重定向到另一个页面
等待MyCustomSignOut(“/SomeOtherPage”);
}
//可能是在公用事业公司
公共异步任务MyCustomSignOut(字符串重定向URI)
{
//注入HttpContextAccessor以获取“上下文”
wait context.SignOutAsync(“Cookies”);
var prop=新的AuthenticationProperties()
{
重定向URI=重定向URI
};
//注销后,这将重定向到您提供的目标
wait context.SignOutAsync(“oidc”,prop);
}

第一行就解决了我的问题

wait-HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
等待_SignInManager.SignOutAsync();
HttpContext.Response.Cookies.Delete(“.AspNetCore.Cookies”);

嗨,也许是饼干。在注销时尝试:等待HttpContext.Authentication.SignOutAsync(“yourcookie”);查看了这个答案,但VS表示该方法已经过时,将在将来的版本中删除。所以我想避免。谁投了反对票,为什么?我在生产环境中运行了这段代码,我在问题中遇到了同样的问题。我确信这是正确的,因为我可以得到问题提供的细节。在我看来,这就像是一个开车经过的落选。愿落选的选票雨点般落在你身上!不过我只能给你一个。我也在做同样的SignOutAsync,然后重定向到Action,对它为什么不起作用感到难过。这是我的perferct修复程序。当与WS-Federation一起使用时,我必须将第二次注销替换为
wait-HttpContext.SignOutAsync(“WsFederation”,prop)
我收到一个错误-“没有为方案“oidc”注册注销身份验证处理程序。
等待\u SignInManager.SignOutAsync();
对我来说已经足够了。它删除了.AspNetCore.Identity.Application cookie。