Cypress跨双超域+AntiforgeryToken场景下测试Nuxt+.NET应用重定向故障
第一步:修正Chromium启动参数
你当前配置的启动参数存在重复项,且缺少2个针对SameSite Cookie的关键禁用配置,替换cypress/plugins/index.js中的对应逻辑为以下代码:
on('before:browser:launch', (browser = {}, launchOptions) => { if (browser.family === 'chromium') { launchOptions.args.push( "--disable-features=SameSiteByDefaultCookies,CookiesWithoutSameSiteMustBeSecure,SameSiteDefaultChecksMethodRigorously,CrossSiteDocumentBlockingIfIsolating,IsolateOrigins,site-per-process" ); } return launchOptions });
第二步:适配Cypress版本的跨域配置
如果你使用的是Cypress 12及以上版本,chromeWebSecurity配置已废弃,需要在cypress.config.js中添加以下配置:
module.exports = defineConfig({ e2e: { experimentalSkipDomainCheck: true, experimentalSessionAndOrigin: true, // 其余原有配置保留 } })
第三步:用cy.origin包裹SSO域操作
所有操作SSO域名的逻辑(包括填写登录表单、提交请求)必须放在cy.origin回调中,否则Cypress会强制隔离跨域上下文导致Cookie丢失,示例代码如下:
cy.visit('你的产品地址') // 触发跳转到SSO cy.origin('你的SSO根域名', () => { cy.get('#username').type('测试账号') cy.get('#password').type('测试密码') cy.get('#submit').click() }) // 回调结束后会自动切回产品域名上下文 cy.url().should('include', '你的产品域名路径')
第四步:强制修正SSO响应的Cookie属性
如果上述配置仍未生效,可以主动拦截SSO认证接口的响应,强制修改Set-Cookie头符合跨域要求:
cy.intercept('POST', '你的SSO登录提交接口地址', (req) => { req.continue((res) => { const cookies = res.headers['set-cookie'] if (cookies) { res.headers['set-cookie'] = cookies.map(cookie => { // 替换原有的SameSite属性,添加Secure标记 return cookie.replace(/SameSite=(Lax|Strict)/i, 'SameSite=None; Secure') }) } }) }).as('ssoLogin')
第五步:兜底方案:跳过前端SSO流程
直接调用SSO的后台认证接口获取凭证,主动将认证Cookie写入产品域名上下文,完全避开跨域Cookie问题:
// 后台请求SSO接口拿token和Cookie凭证 cy.request('POST', 'SSO后台登录接口地址', { username: '测试账号', password: '测试密码' }).then((res) => { // 提取响应中的认证Cookie信息,逐个写入产品域名 cy.setCookie('你的产品认证Cookie名', res.body.token, { domain: '你的产品根域名', sameSite: 'none', secure: true }) }) // 直接访问产品地址即可跳过登录 cy.visit('你的产品地址')
内容的提问来源于stack exchange,提问作者Alexandre Q
相关产品推荐
相关产品推荐

