.NET Core 5 对接外部OAuth2站点如何实现强制登出?
由于浏览器同源策略限制,你的.NET Core后端无法直接操作用户浏览器中restream.io域名下的登录态Cookie,因此无法仅通过后端C#代码直接清除用户在外部站点的登录会话,可通过以下两种符合OAuth2标准的方案实现需求,均支持C#后端集成:
方案1:通过OAuth2 登出端点触发登出(不撤销已有令牌)
首先确认Restream的OpenID Connect元数据配置(路径为https://api.restream.io/.well-known/openid-configuration)是否存在end_session_endpoint字段,如果存在可直接构造登出跳转链接:
// 替换为实际从元数据中获取的登出端点 var restreamEndSessionEndpoint = "https://api.restream.io/logout"; // 登出完成后跳转回你的应用的地址 var postLogoutRedirectUri = Uri.EscapeDataString("https://你的应用域名/登出回调路径"); var logoutUrl = $"{restreamEndSessionEndpoint}?client_id=[你的client_id]&post_logout_redirect_uri={postLogoutRedirectUri}"; // 后端直接返回重定向结果,触发用户浏览器跳转至Restream登出页 return Redirect(logoutUrl);
用户跳转后Restream会自动清除其站点下的登录态,完成后自动跳回你指定的回调地址,该操作不会撤销你已经获取到的访问令牌、刷新令牌,符合使用需求。
方案2:授权时强制重新登录(无额外开发成本)
直接在你构造的OAuth2授权链接中添加标准参数prompt=login,无论用户之前是否在Restream处于登录状态,都会强制要求用户重新输入账号密码完成身份校验,从根源避免复用旧登录态的问题,不需要额外开发登出逻辑:
修改后的授权链接格式:https://api.restream.io/login?response_type=code&client_id=[clientid]&redirect_uri=[redirectURI]&state=[randomOpaqueToken]&prompt=login
C#后端构造授权链接时直接拼接该参数即可,适配所有OAuth2兼容的身份提供商,实现成本最低。
注意:不要尝试通过后端HttpClient模拟请求Restream登出接口,用户的登录态Cookie仅存储在用户本地浏览器中,后端发起的请求无法携带对应Cookie,无法达到清除用户本地登录态的效果。
内容的提问来源于stack exchange,提问作者mharran

