ASP.NET Core MVC对接EKOAPP外部认证如何通过POST请求实现登出
解决方案
方案1:自动提交表单方案(推荐,无需EKO侧额外配置)
该方案利用浏览器表单提交不受CORS限制、自动携带目标域名Cookie的特性,完美适配EKO的登出要求,是目前兼容性最好的实现方式:
第一步:修改后端登出接口
仅清除本地应用的身份Cookie即可,无需调用OpenIdConnect的登出方法(EKO未实现OIDC会话标准,调用会报错),返回一个自动提交表单的中间页面:
[HttpPost] public async Task<IActionResult> Logout() { // 清除本站点的身份认证Cookie,完成本地登出 await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); // 传入登出完成后跳转回本站的地址 ViewBag.PostLogoutRedirectUri = Url.Action("Index", "Home", null, Request.Scheme); return View(); }
第二步:创建自动提交表单的登出中间页
新增Logout.cshtml视图,内容如下:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <title>正在登出...</title> </head> <body onload="document.getElementById('ekoLogoutForm').submit()"> <form id="ekoLogoutForm" action="https://app-h1.eu.ekoapp.com/api/v1/auth/logout" method="post"> <!-- 若EKO登出接口支持回调参数,可在此处添加隐藏域传入回调地址,参数名需以EKO官方要求为准 --> <input type="hidden" name="post_logout_redirect_uri" value="@ViewBag.PostLogoutRedirectUri" /> <noscript> <p>浏览器未启用JavaScript,请点击下方按钮完成登出:</p> <button type="submit">确认登出</button> </noscript> </form> <!-- 若EKO不支持回调参数,可添加以下JS,登出请求发送后自动跳回本站 --> <script> setTimeout(() => { window.location.href = "@ViewBag.PostLogoutRedirectUri"; }, 1500); </script> </body> </html>
方案2:前端AJAX请求方案(需EKO侧配置CORS)
如果EKO侧可以配置CORS规则,可联系EKO运维将你的应用域名添加到https://app-h1.eu.ekoapp.com/api/v1/auth/logout接口的CORS允许列表,同时开启允许携带凭证(Credentials)的权限,配置完成后你之前的前端AJAX代码即可正常运行。
注意事项
之前调用OIDC登出报错是因为EKO未实现OIDC标准的end_session_endpoint端点,无需再尝试走标准OIDC登出流程,按上述自定义方案实现即可。
内容的提问来源于stack exchange,提问作者Andreas P.
相关产品推荐
相关产品推荐

