使用IdentityServer的AspCore客户端全局注销

时间:2016-10-20 18:05:24

标签: asp.net asp.net-mvc asp.net-core asp.net-identity identityserver4

在非核心的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应用程序中注销但未在身份服务器上注销。

我如何全球退出?所以我需要在身份服务器上辞职?

3 个答案:

答案 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单点登出的官方文档:

single sign out documentation

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

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");
    }
}