在一个非核心的asp mvc应用程序中,我有一个控制器动作来signout用户全局
它看起来是这样的
public ActionResult Logout()
{
Request.GetOwinContext().Authentication.SignOut();
return Redirect("/");
}
现在我有一个asp核心客户端,想要注销我尝试
public async Task<ActionResult> LogOut()
{
if (User.Identity.IsAuthenticated)
{
await HttpContext.Authentication.SignOutAsync("Cookies");
}
return Redirect("/");
}
现在似乎我得到登出,但我重定向到一个网站,需要授权。我可以看到我很快又被重定向到身份服务器,它会自动地把我重新唱到。
总结:我在asp应用程序中注销了,但在身份服务器上没有。
如何全局签到?所以我需要在身份服务器上辞职吗?
如果使用OpenIdConnect
认证,还需要远程签出。试着像下面这样修改你的代码:
public async Task<ActionResult> LogOut()
{
if (User.Identity.IsAuthenticated)
{
await HttpContext.Authentication.SignOutAsync("Cookies");
await context.Authentication.SignOutAsync(OpenIdConnectDefaults.AuthenticationScheme, new AuthenticationProperties()
{
RedirectUri = "<signed out url>"
});
// if you use different scheme name for openid authentication, use below code
//await context.Authentication.SignOutAsync(<your openid scheme>, new AuthenticationProperties()
//{
// RedirectUri = "/signedout"
//});
}
return Redirect("/");
}
参见原始示例https://github.com/aspnet/Security/blob/dev/samples/OpenIdConnectSample/Startup.cs
我遇到了同样的问题,为了解决这个问题,我不得不在我的IdentityServer应用程序中自己清除响应cookie。
var cookies = HttpContext.Request.Cookies.Keys;
foreach (var cookie in cookies)
{
HttpContext.Response.Cookies.Delete(cookie, new CookieOptions
{
Domain = "localhost" // Your host name here
});
}
// SignOutAsync depends on IdentityServer4 > Microsoft.AspNetCore.Http.Authentication
await HttpContext.Authentication.SignOutAsync();
我所做的是,当我的客户端想要退出时,我将其重定向到我的IdentityServer应用程序,该应用程序如上所述清除响应cookie。
在此代码中,我删除了localhost
的所有cookie,但是您可以在那里添加一个过滤器,并仅删除IdentityServer用于持久用户身份验证的cookie。
下面你会看到更多关于这个实现的细节。
http://benjii.me/2016/04/single-sign-out-logout-identity-server-4/
这是ASP的官方文档。. NET身份服务器单点签出:
单点签到文档
这是从他们的演示实现中获取的一个示例:
public ActionResult Signout()
{
Request.GetOwinContext().Authentication.SignOut();
return Redirect("/");
}
public void SignoutCleanup(string sid)
{
var cp = (ClaimsPrincipal)User;
var sidClaim = cp.FindFirst("sid");
if (sidClaim != null && sidClaim.Value == sid)
{
Request.GetOwinContext().Authentication.SignOut("Cookies");
}
}