ASP.NET MVC:Owin第三方登录重定向在弹窗内而非主页面
解决Owin第三方登录弹窗重定向后主页面不刷新问题
问题核心是登录流程在弹窗内完成,回调的重定向仅作用于弹窗窗口,主页面无法感知登录状态变更。可以通过后端返回前端脚本的方式,让弹窗通知主页面刷新/跳转,同时关闭弹窗。
步骤1:修改ExternalLoginCallback方法的成功分支
将登录成功后的直接重定向,改为返回一个包含交互脚本的视图:
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false); switch (result) { case SignInStatus.Success: // 替换原有重定向,返回登录成功的视图 return View("LoginSuccess", new { ReturnUrl = returnUrl }); case SignInStatus.LockedOut: return View("Lockout"); case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl }); case SignInStatus.Failure: default: var existingUser = UserManager.FindByEmail(loginInfo.Email); if (existingUser != null) { // 注意:你代码里的exisitingUser是拼写错误,要改为existingUser var addLoginResult = await UserManager.AddLoginAsync(existingUser.Id, loginInfo.Login); if (addLoginResult.Succeeded) { await SignInManager.SignInAsync(existingUser, isPersistent: false, rememberBrowser: false); // 同样替换为返回视图 return View("LoginSuccess", new { ReturnUrl = returnUrl }); } } return Redirect("LoginFailure"); } }
步骤2:创建LoginSuccess视图
在Views/Account目录下新建LoginSuccess.cshtml,写入以下脚本:
@{ Layout = null; } <script> // 与主窗口通信,触发刷新或跳转 if (window.opener) { // 优先跳转到指定的returnUrl,否则刷新主页面 const targetUrl = '@Model.ReturnUrl' || window.opener.location.href; window.opener.location.href = targetUrl; // 关闭当前登录弹窗 window.close(); } else { // 兼容直接打开登录页面的场景,直接跳转 window.location.href = '@Model.ReturnUrl'; } </script>
步骤3:确保前端正确打开登录弹窗
前端打开登录页面时,使用window.open创建弹窗,不要用iframe,确保弹窗能和主页面通信:
function openGoogleLogin() { const returnUrl = encodeURIComponent(window.location.href); const popup = window.open( `/Account/ExternalLogin?provider=Google&returnUrl=${returnUrl}`, 'GoogleLoginPopup', 'width=600,height=650,top=100,left=100' ); }
额外注意点
- 修复代码中的拼写错误:
exisitingUser→existingUser,否则会引发编译错误。 - 确保
returnUrl是合法的本地地址,可在返回LoginSuccess视图前复用RedirectToLocal的逻辑做安全校验。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

