注销时 Asp.Net Core 中的 Cookie 未删除

Cookies Not Deleting in Asp.Net Core on Sign Out

我一直在努力确保我的用户已注销。我是 运行 一个连接了 API 和 Cookie Auth 的 Vue SPA。我似乎遇到的问题是,无论我做什么,我的 Cookie 都不会被删除或过期。

我已将对 signInManager.SignOutAsync() 的所有调用替换为共享 LogOutService 方法,如下所示...

        public async Task LogOutAsync()
        {
            var context = httpContextAccessor.HttpContext;

            if (context == null)
            {
                await identityRepository.SignOutAsync();
                logger.LogInformation("User signed out with no context.");
            }
            else
            {
                var relevantCookies = context.Request.Cookies
                    .Where(c => 
                        c.Key.Contains(".AspNetCore.") || c.Key.Contains(".AspNet.") || c.Key.Contains("Microsoft.Authentication"));

                foreach (var cookie in relevantCookies)
                {
                    context.Response.Cookies.Delete(cookie.Key);
                }

                await identityRepository.SignOutAsync();
                context.Session.Clear();
                logger.LogInformation("User signed out and cookies and session were cleared.");
            }
        }

我已经按照代码进行操作,它正在按预期执行。我已经尝试用创建一个新的、过期的 Cookie 来替换 Delete 调用(我相信,这在内部就是 Delete 方法在 Core 中的作用),结果是一样的……没有。

在我迁移到 .net Core 之前一切正常 - 只需调用 signInManager.SignOutAsync().

我怎样才能注销用户?

我偶然发现了这个问题的答案。

在我的代码中,上面的方法在抛出异常之前在 catch 中被调用。

如果您删除 cookie,那么一旦您抛出异常,异常就会劫持整个响应,您所有的 cookie 集都会丢失。

如果你需要它工作,那么你不需要抛出异常(在我的例子中,我从方法返回 null 并手动记录错误)。

这将适用于任何拦截和替换响应的内容,例如自定义中间件,因此如果您有类似的问题,可以从一个好的地方开始寻找。