我有一个startityserver4项目,可以处理登录功能和单独的mvcclient,我需要从mvc client中有一个登录功能):
public async Task Logout()
{
await HttpContext.Authentication.SignOutAsync("Cookies");
await HttpContext.Authentication.SignOutAsync("oidc");
}
但是在" IdentityServer4"项目中,有一个更复杂的注销,似乎做得更多:
[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
public async Task<IActionResult> Logout(LogoutViewModel model)
{
var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId);
if (vm.TriggerExternalSignout)
{
string url = Url.Action("Logout", new { logoutId = vm.LogoutId });
try
{
// hack: try/catch to handle social providers that throw
await HttpContext.Authentication.SignOutAsync(vm.ExternalAuthenticationScheme,
new AuthenticationProperties { RedirectUri = url });
}
catch (NotSupportedException) // this is for the external providers that don't have signout
{
}
catch (InvalidOperationException) // this is for Windows/Negotiate
{
}
}
// delete authentication cookie
await _signInManager.SignOutAsync();
return View("LoggedOut", vm);
}
有人可以解释客户端真正需要的逻辑。
MVC客户端中使用了第一个注销方法。第二个代码属于IdentityServer服务。
第一个注销将注销过程的某些状态初始化,并将其重定向到IdentityServer上的注销视图(如果您查看样本,则在sidentityServer accountController代码中有两个登录名:一个用于登录验证视图和一个Post Post Handler)。