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 ); |