注销时 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 并手动记录错误)。
这将适用于任何拦截和替换响应的内容,例如自定义中间件,因此如果您有类似的问题,可以从一个好的地方开始寻找。
我一直在努力确保我的用户已注销。我是 运行 一个连接了 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 并手动记录错误)。
这将适用于任何拦截和替换响应的内容,例如自定义中间件,因此如果您有类似的问题,可以从一个好的地方开始寻找。