在 Account/Logout 页面中,它位于您的脚手架ASP.NET核心标识代码中的 Areas/Identity/Account/Logout.cshtml.cs 下,有一个 OnGet 处理程序,如下所示:
public void OnGet() { }
因为这是使用ASP.NET Core Razor Pages,所以这一切都是渲染相应的 Logout.cshtml 页面 . 在您的示例中,当您在MVC应用程序中点击 Logout 时,它会清除自己的cookie,然后将您转到IS4应用程序(具体为 OnGet ) . 因为这个 OnGet 处理程序是空的,所以's not really doing anything and it'肯定不会让你退出IS4应用程序 .
如果你看一下 Logout.cshtml.cs 里面的 OnPost 处理程序,你会发现它看起来像这样:
public async Task OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
// ...
}
这个对 SignOutAsync 的调用完全符合它的建议:它会让你退出IS4本身 . 但是,在当前工作流程中,未调用此 OnPost 处理程序 . 正如我已经提到的那样,当您在MVC应用程序中使用 Logout 时,会间接调用 OnGet 处理程序 .
现在,如果您查看Quickstart.UI项目中IS4注销的控制器/操作实现,您将看到它基本上将 GET 请求传递给 POST 请求 . 这是代码,删除了注释:
[HttpGet]
public async Task Logout(string logoutId)
{
var vm = await BuildLogoutViewModelAsync(logoutId);
if (vm.ShowLogoutPrompt == false)
return await Logout(vm);
return View(vm);
}
当注销时,主要是这个代码正在处理的事情 - 如果不需要提示,它会直接传递给 POST 请求处理程序 . 这是 POST 的代码片段:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Logout(LogoutInputModel model)
{
var vm = await BuildLoggedOutViewModelAsync(model.LogoutId);
if (User?.Identity.IsAuthenticated == true)
{
await HttpContext.SignOutAsync();
// ...
}
// ...
return View("LoggedOut", vm);
}
这里的重要一行是对 HttpContext.SignOutAsync 的调用 - 这最终会删除IS4用来保持登录的cookie . 一旦删除,你就会退出IS4 . 最终,这是您当前实施中缺少的内容 .
在最简单的级别,您可以通过更新 OnGet 来解决您的问题,如下所示:
public async Task OnGet()
{
if (User?.Identity.IsAuthenticated == true)
{
await _signInManager.SignOutAsync();
return RedirectToPage(); // A redirect ensures that the cookies has gone.
}
return Page();
}
这不支持 ShowLogoutPrompt 选项我只是使用 _signInManager 来执行注销,因为您处于ASP.NET核心身份世界中 .
我鼓励你从Quickstart.UI实现中探索完整的源代码,以便支持 ShowLogoutPrompt , returnUrl 等 - 如果不写书,我不可能在这里做 .