You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨域获取会话失败:mysite与shop.mysite单点登录问题排查

跨域单点登录接口调用问题

背景

我负责维护PHP站点mysite.com和ASP.NET站点shop.mysite.com,需实现单点登录功能。已在ASP.NET站点开发IsUserLoggedIn接口,用于返回用户登录状态、用户名及角色数组。

ASP.NET 接口实现代码

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> IsUserLoggedIn()
{
    try
    {
            if (HttpContext.Request.Headers["api-key"][0] != configuration["ApiKey"])
            {
                HttpContext.Response.StatusCode = 200;
                return Json(new { authenticated = "no key", roleId = "" });
            }

            if (HttpContext.User.Identity.IsAuthenticated)
            {
                var user = await userOperations.GetUser.Execute(HttpContext.User);
                var companyUser = await companyRepository.GetUser(user.Id, user.ActiveCompanyId);

                var roles = new List<String>();
                if (companyUser.Company.CustomerRoles != null)
                {
                    roles.AddRange(companyUser.Company.CustomerRoles);
                }

                if (companyUser.UserCompanies != null)
                {
                    foreach (var company in companyUser.UserCompanies)
                    {
                        if (company.CustomerRoles != null)
                        {
                            roles.AddRange(company.CustomerRoles);
                        }
                    }
                }

                HttpContext.Response.StatusCode = 200;
                return Json(new { authenticated = "yes", User = user, roleId = roles });
            }
            else
            {
                HttpContext.Response.StatusCode = 200;
                return Json(new { authenticated = "not auth", roleId = "" });
            }
    }
    catch (AuthenticationException e)
    {
        HttpContext.Response.StatusCode = 200;
        return Json(new { authenticated = "error", roleId = "", e });
    }
}

直接访问接口的正常结果

登录shop.mysite.com后,在新标签页访问该接口(携带api-key请求头),返回预期的认证结果:

{
  "authenticated": "yes",
  "user": {
    "id": 17085,
    "username": "cdavis",
    "verified": true,
    "activeCompanyId": "TEST001"
  },
  "roleId": [
    "NGFE"
  ]
}

PHP站点的Fetch调用代码

在mysite.com中通过JavaScript的fetch方法调用该接口,代码如下:

async function checkUserLoggedIn() {
    try {
        const response = await fetch('https://' + custom_script_vars.api_url + '/User/IsUserLoggedIn', {
            method: 'GET',
            headers: {
                'api-key': custom_script_vars.api_key,
            },
            credentials: 'include',
        });
        
        console.log('Response status:', response.status);

        if (response.ok) {
            const jsonData = await response.json();
            console.log('User logged in:', jsonData);

            const phpEndpoint = custom_script_vars.theme_directory + '/set-session.php';

            await fetch(phpEndpoint, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ companyResourcesSessionUserLoggedIn: jsonData }),
            });
            console.log('User logged in:', jsonData);
        } else {
            console.error('Failed to check user login status:', response.status);
        }
    } catch (error) {
        console.error('Error during user login check:', error);
    }
}

Fetch调用的异常结果

上述fetch调用返回未认证的结果:

{
  "authenticated": "not auth",
  "roleId": ""
}

疑问

我是否在执行不被允许的操作?已在Chrome和Edge浏览器测试,结果一致。猜测fetch调用和直接在标签页访问接口的行为不同,希望了解此类场景的替代实现方案。


内容的提问来源于stack exchange,提问作者Chris Davis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:37:26