3

在非核心 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 应用程序中登出,但没有在身份服务器上登出。

我怎样才能全局注销?所以我需要在身份服务器上登录?

4

3 回答 3

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。

在此代码中,我将删除所有 Cookie localhost,但是您可以在此处添加过滤器并仅删除 IdentityServer 用来保持用户身份验证的 cookie。

您将在下面找到有关此实现的更多详细信息。

http://benjii.me/2016/04/single-sign-out-logout-identity-server-4/

于 2017-03-03T11:30:10.857 回答
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

于 2016-10-21T07:32:32.940 回答
0

这是 ASP.NET Identity Server Single Sign-Out 的官方文档:

单点注销文档

这是从他们的演示实现中获取的示例:

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");
    }
}
于 2016-10-20T18:28:28.613 回答