关于c#:为什么GetExternalLoginInfoAsync() 在这种情况下返回null?

Why does GetExternalLoginInfoAsync() return null in this case?

我使用 Identity2 MVC5 和 Google 登录创建了一个应用来对 Google 进行 SSO...

如果我登录成功,则关闭浏览器,然后重新登录,
此代码块获取 loginInfo == null,

1
2
3
4
5
6
7
8
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
        {
            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
            if (loginInfo == null)
            {
                return RedirectToAction("LogOut" );
                //return RedirectToAction("Login");
            }

我最好的猜测是 asp.net cookie 是 session 并因此被删除,但 Google Oauth 令牌仍在某处徘徊......

这是怎么回事?
如何清理 oauth 令牌?

我尝试了几种方法,在登录页面的 PageReady 处运行(即在点击登录页面时清理所有持久登录)

1
2
3
4
5
6
7
8
9
10
11
var user = UserManager.FindByName( User.Identity.Name );
var AuthenticationManager = HttpContext.GetOwinContext().Authentication;

AuthenticationManager.SignOut();
AuthenticationManager.SignOut( DefaultAuthenticationTypes.ApplicationCookie );
Session.Abandon();

if ( user != null )
{
    UserManager.UpdateSecurityStamp( user.Id ); // remove the old cookie so it cant' be reused to re-log in - EWB
}

最后是

1
    return Redirect("https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=https://"+ Url.Action("Index","Home", new { target ="_blank" } ) ); //https://stackoverflow.com/questions/27515518/asp-net-identity-external-login-wont-log-out - f belihocine answer

这应该是从谷歌注销(并进入我们的自定义注销页面,所以它似乎是真的)。??

但我仍然得到相同的行为

到底发生了什么?

如果我等到超时到期(10 分钟)一切正常...


它返回 null,因为我正在创建一个应用程序 cookie 和一个外部 cookie,并且只删除应用程序 cookie。

按照我想要的方式调用它退出

1
2
 Request.GetOwinContext().Authentication.SignOut( DefaultAuthenticationTypes.ApplicationCookie );// https://stackoverflow.com/questions/28999318/owin-authentication-signout-doesnt-seem-to-remove-the-cookie - stralos s answer
 Request.GetOwinContext().Authentication.SignOut( DefaultAuthenticationTypes.ExternalCookie );