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

3
在一个非核心的ASP MVC应用程序中,我有一个控制器操作用于全局注销用户。它看起来像这样:
   public ActionResult Logout()
    {
        Request.GetOwinContext().Authentication.SignOut();
        return Redirect("/");
    }

现在我有一个ASP Core客户端,想要一个注销功能,我尝试了:

 public async Task<ActionResult> LogOut()
        {
            if (User.Identity.IsAuthenticated)
            {
                await HttpContext.Authentication.SignOutAsync("Cookies");
            }
            return Redirect("/");
        }

更新

现在我好像已经登出了,但是我被重定向到需要认证的网站。 我可以看到我很快又被重定向回身份服务器,自动重新登录。

总结: 我在我的asp应用程序中注销了,但在身份服务器上没有注销。

如何全局注销?以便我需要在身份服务器上重新登录?

3个回答

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
我遇到了同样的问题,为了解决它,我必须在我的IdentityServer应用程序中清除响应cookies。
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应用程序,如上所述清除响应Cookies。
在此代码中,我正在删除所有localhost的Cookies,但是您可以添加一个过滤器,并仅删除IdentityServer用于持久化用户身份验证的Cookie。
下面您将找到有关此实现的更多详细信息。 http://benjii.me/2016/04/single-sign-out-logout-identity-server-4/

0

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

我认为在这种情况下它并不有用,因为我们正在谈论AspNetCore应用程序,并且我们在托管代码中使用了OWIN库。 然而,在使用OWIN的非asp.net核心应用程序中它是正常工作的。 - Alexz S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接