ServiceStack AuthProvider登出在部署环境失效问题排查
我们项目重写了ServiceStack的Logout方法,目的是移除ss-tok Cookie。本地测试正常,但部署到生产环境后,调用base.Logout()后ss-tok仍保留在Cookie列表里,导致用户下次访问无需重新登录。
现有代码:
public class SSOAuthProvider : AuthProvider { public override object Logout(IServiceBase service, Authenticate request) { return base.Logout(service, request) as AuthenticateResponse; } }
期望:调用AuthProvider的Logout方法后彻底清除ss-tok,用户下次访问必须重新登录。
问题分析
常见的问题原因包括:
- 部署环境的Cookie路径、域配置和本地不一致,导致清除指令没匹配到目标Cookie
- 生产环境启用了HTTPS,但清除Cookie时未设置对应的
Secure属性,浏览器会忽略清除操作 base.Logout()的默认逻辑在部分部署场景下未正确触发Cookie清除动作
解决方案
1. 手动强制清除 ss-tok Cookie
在重写的Logout方法中主动添加清除逻辑,确保覆盖所有环境配置:
public class SSOAuthProvider : AuthProvider { public override object Logout(IServiceBase service, Authenticate request) { var response = base.Logout(service, request) as AuthenticateResponse; // 手动清除ss-tok Cookie,匹配原Cookie的属性 var httpRes = service.Response as IHttpResponse; if (httpRes != null) { var cookieOptions = new CookieOptions { Path = "/", // 若项目有特定路径,需替换为ss-tok实际的Path值 Domain = null, // 若原Cookie设置了Domain,需填写对应的域 Secure = service.Request.IsSecureConnection, // 适配HTTPS环境 HttpOnly = true // 保持与原Cookie一致的HttpOnly属性 }; httpRes.Cookies.Delete("ss-tok", cookieOptions); } return response; } }
2. 核对部署环境的Cookie配置
- 先查看生产环境中
ss-tok的实际Path和Domain属性,确保清除时使用完全一致的参数 - 若部署在HTTPS环境,必须保证清除Cookie时
Secure属性设为true,否则浏览器会拒绝执行清除指令
3. 验证ServiceStack全局配置
确认AppHost中的Auth配置与本地一致,比如:
Plugins.Add(new AuthFeature(() => new CustomUserSession(), new IAuthProvider[] { new SSOAuthProvider(appSettings), }) { IncludeAssignRoleServices = false, // 确认Logout相关路径、规则配置正确 });
内容的提问来源于stack exchange,提问作者Kiranmayee Jena
相关产品推荐
相关产品推荐

