微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Angular Service Worker 缓存对包含 SAML2 对象的 POST 请求的 302 响应

如何解决Angular Service Worker 缓存对包含 SAML2 对象的 POST 请求的 302 响应

根据我的理解,Angular Service Worker 不会/无法缓存 POST 请求。但是,我面临一个奇怪的问题。 我的应用程序提供 SSO,我们在其中与客户的 ADFS 系统集成并解析 SAML2 XML 响应。流量是

  1. 员工前往公司的 adfs 网站,登录并选择我们的应用

  2. 客户端服务器(身份提供者)向我们的服务器发送包含 saml2 响应的 POST 请求 - 启用了发布绑定

  3. 我们的服务器(服务提供商)解析响应,提取 XML,进行一系列安全测试,从属性提取电子邮件查询数据库以检查用户是否存在并发送 302 响应状态与位置作为我们应用程序的登录页面,并带有一些 URL 参数来指示成功状态。如果状态为成功,也可以设置 cookie

问题是当 Service Worker 被激活时,我第一次使用我的浏览器(最新的 Firefox 和 Chrome)时它可以工作,我可以在网络检查选项卡中看到 302 状态。 cookie 已设置,没有缓存头和登录按预期工作。该 API 的第二次状态代码200,类型为“service worker”,我的服务器日志显示 API 甚至没有访问服务器 - 在第 3 点中讨论 API)将状态代码更改为 { {1}} 给出了相同的行为。

如果我从浏览器中禁用 Service Worker,请使用隐身模式或从 Angular 应用程序禁用 Service Worker,它会按预期工作。分享相关代码 -

未使用自定义 Service Worker 代码

Node 中 SSO 的回调 API

303

我已经看到一些 SO 答案谈论从 Service Worker 手动处理 // d is req.body here const saml2Login = async (d,req,res,redirectResp) => { const protocol = 'https://'; const saml2SuccessRedirect = `${protocol}${req.headers.host}?type=saml2LoginSuccess`; const saml2FailureRedirect = `${protocol}${req.headers.host}?type=saml2LoginFail`; if (!d.SAMLResponse) { return redirectResp(`${saml2FailureRedirect}&code=162`); } const xml = base64ToAscii(d.SAMLResponse); const saml2Response = await parseStringPromise(xml).catch((e) => { console.log('saml2Login: error',e.message); }); if (!saml2Response) { return redirectResp(`${saml2FailureRedirect}&code=162`); } const { root,samlStatus,issuer,assertion,version,destination,saml2Protocol,notBefore,notOnorAfter,x509Certificate,signature,attributes,} = parseSAML2Response(saml2Response['samlp:Response']); const { email,upn,firstName,lastName,} = attributes; console.log('attributes',attributes); // lot of security checks are done // Check db using user email,return user if (!user.enabled) { return redirectResp(`${saml2FailureRedirect}&code=148`); } let token = jwtSign({ userId: user.userId,clientId: client.clientId },duration); setToken(res,token,duration); return redirectResp(`${saml2SuccessRedirect}&userId=${user.userId}`); } let redirectResp = (url) => { // disable cache to ensure query params in the redirect work properly res.writeHead(302,{ 'Location': url,'Content-Type': 'text/html','Cache-Control': 'private,no-cache,no-store,must-revalidate','Pragma': 'no-cache','Expires': 0 }); res.end(); } const setToken = function(res,timeInSeconds) { res.setHeader('Set-Cookie','x-myCompany-token=' + (token || '') + '; Domain=' + conf.host + '; Max-Age=' + timeInSeconds + ' HttpOnly; SameSite=Strict'); } 代码,但这些都是为了响应 GET 请求。我需要一些有关如何在不禁用 Service Worker 的情况下解决重定向问题的指导。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。