在非核心的asp mvc应用程序中,我有一个控制器动作,用于注销用户全局
它看起来像这样
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应用程序中注销但未在身份服务器上注销。
我如何全球退出?所以我需要在身份服务器上辞职?
答案 0 :(得分:1)
如果您使用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
答案 1 :(得分:1)
我遇到了同样的问题并且要解决它我必须在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/
答案 2 :(得分:0)
以下是ASP.NET Identity Server单点登出的官方文档:
这是从他们的演示实现中获取的示例:
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");
}
}