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

基于IdentityServer/OpenIdConnect实现同用户跨SPA应用跳转

需求可行性与实现方案

结论

你的需求完全可行,IdentityServer4的**委托扩展授权(Delegation Grant)**就是专门解决这类跨客户端的用户身份传递场景的,非常匹配你的诉求。

核心逻辑

当用户已在site1(客户端A)完成认证后,要无缝打开另一客户端应用(客户端B),本质是让客户端A代表用户向IdentityServer请求一个针对客户端B的令牌,客户端B验证该令牌即可直接识别用户身份,无需用户再次登录。

扩展授权(委托授权)的适用说明

你参考的扩展授权文档中,委托授权的核心规则与流程如下:

  1. 前置配置要求:
    • 客户端A需在IdentityServer中配置为允许使用urn:ietf:params:oauth:grant-type:delegation扩展授权类型
    • 客户端A需拥有向客户端B委托身份的权限,即在客户端配置的AllowedGrantTypes中添加扩展授权类型,同时AllowedScopes需包含客户端B所需的身份/API范围
  2. 执行流程:
    • site1(客户端A)获取当前用户的有效访问令牌
    • 客户端A向IdentityServer的令牌端点发送请求,指定delegation授权类型,携带自身客户端凭证、用户原始访问令牌、目标客户端B的ID及所需范围
    • IdentityServer验证客户端A的权限、原始令牌有效性后,颁发针对客户端B的访问令牌或ID令牌
    • site1使用新令牌,通过跳转/内嵌方式打开客户端B,客户端B直接验证令牌即可完成用户身份识别

代码实现关键点

1. IdentityServer端配置

为客户端A添加扩展授权支持:

new Client
{
    ClientId = "site1-client",
    AllowedGrantTypes = GrantTypes.CodeAndClientCredentials,
    // 添加委托扩展授权类型
    AllowedGrantTypes.Add("urn:ietf:params:oauth:grant-type:delegation"),
    // 授予访问客户端B所需范围的权限
    AllowedScopes = { "openid", "profile", "site2-api" },
    ClientSecrets = { new Secret("site1-secret".Sha256()) },
    // 其他常规配置...
}

2. 客户端A(Angular)请求委托令牌

在site1中调用IdentityServer令牌端点获取目标客户端的令牌:

// 假设已获取当前用户的access_token
const delegationRequest = {
    grant_type: 'urn:ietf:params:oauth:grant-type:delegation',
    client_id: 'site1-client',
    client_secret: 'site1-secret',
    token: currentUserAccessToken,
    scope: 'openid profile site2-api',
    requested_token_type: 'id_token' // 若客户端B需ID令牌做身份认证
};

// 发送POST请求到IdentityServer的/token端点
fetch('/connect/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams(delegationRequest)
})
.then(response => response.json())
.then(data => {
    // 获取令牌后跳转至客户端B,建议用哈希传递令牌避免日志泄露
    window.open(`https://site2.com/login#token=${data.id_token}`, '_blank');
});

3. 客户端B验证令牌

客户端B(.NET Core/Angular)配置OpenIdConnect认证,直接验证传入的令牌:

// .NET Core后端认证配置
services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.Authority = "https://your-identityserver-domain";
    options.ClientId = "site2-client";
    options.ClientSecret = "site2-secret";
    options.ResponseType = "id_token";
    // 配置令牌验证规则
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = "https://your-identityserver-domain",
        ValidateAudience = true,
        ValidAudience = "site2-client"
    };
});

注意事项

  • 遵循最小权限原则,仅授予客户端A必要的委托范围,避免权限过度分配
  • 令牌传输全程使用HTTPS,防止令牌被窃取
  • SPA场景下建议用哈希(#token=xxx)传递令牌,避免令牌出现在URL查询参数中导致日志泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:28:08