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

ASP.NET Core MVC如何从Cookie获取JWT并连接认证SignalR?

从Cookie提取JWT用于SignalR连接的可行方案

完全可以实现,下面是具体操作步骤:

1. 确保后端保存Access Token

在MVC项目的认证配置里,必须开启SaveTokens = true,这样ASP.NET Core会把Identity Server返回的access_token(JWT)存入认证会话的Properties中,方便后端后续读取:

// Program.cs 中的认证配置示例
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
    options.Authority = "你的Identity Server地址";
    options.ClientId = "MVC客户端ID";
    options.ClientSecret = "客户端密钥";
    options.ResponseType = "code";
    options.SaveTokens = true; // 关键配置:保存token到会话
    options.Scope.Add("API所需的权限范围");
});

2. 在MVC视图中获取明文JWT

前端JS无法直接读取加密的认证Cookie,所以要在Razor视图里从后端拿到明文的access_token,再传递给JS:

@{
    // 从HttpContext读取已保存的access_token
    var accessToken = await HttpContext.GetTokenAsync("access_token");
}

<script>
    // 将后端获取的token赋值给JS变量
    const signalRAccessToken = '@accessToken';
</script>

3. 配置SignalR客户端使用Bearer令牌

初始化SignalR连接时,禁用自动发送Cookie,手动在请求头中携带Bearer令牌:

// 创建SignalR连接实例
const connection = new signalR.HubConnectionBuilder()
    .withUrl("https://你的API地址/目标WebSocketHub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets,
        withCredentials: false, // 禁用自动携带Cookie
        headers: {
            "Authorization": `Bearer ${signalRAccessToken}` // 手动添加Bearer令牌
        }
    })
    .build();

// 启动连接
connection.start()
    .then(() => console.log("WebSocket连接成功"))
    .catch(err => console.error(err.toString()));

4. 额外注意事项

  • 确保Web API项目已配置好Bearer认证,能正常验证Identity Server签发的JWT。
  • 若access_token过期,需处理刷新逻辑:用refresh_token向Identity Server请求新的access_token,再更新SignalR连接的请求头。
  • 做好XSS防护:避免access_token长期暴露在DOM中,必要时可临时存在sessionStorage,但需同步做好XSS防范措施。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:12:04