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

如何将Zendesk接入IdentityServer4并通过JWT实现用户访问校验

解决方案

IdentityServer4 原生提供 ITokenService 内置接口,可以直接在服务内部生成符合要求的 JWT 令牌,不需要发起内部 HTTP 请求调用 connect/token 端点。


实现步骤

  • 首先在你需要生成令牌的控制器/业务服务中,注入ITokenService、IHttpContextAccessor(用于获取当前已登录用户的身份凭证)
  • 构造TokenCreationRequest参数对象,按需配置字段:
    • 受众(Audience)填写Zendesk后台要求的JWT受众值,一般为你的Zendesk帮助中心域名
    • 声明(Claims)补充Zendesk要求的必填字段,比如用户邮箱、姓名、外部用户ID,可以从当前登录用户的Claims中提取,也可以手动补充
    • 有效期按照Zendesk要求配置,建议设置为5分钟以内,降低令牌泄露风险
  • 调用ITokenService.CreateTokenAsync()方法传入构造好的TokenCreationRequest,拿到Token对象后,再调用ITokenService.CreateSecurityTokenAsync()将Token对象序列化为字符串格式的JWT
  • 最后把生成的JWT作为参数拼接到Zendesk指定的回调地址中,重定向用户即可

代码示例

public class ZendeskAuthController : Controller
{
    private readonly ITokenService _tokenService;
    private readonly IHttpContextAccessor _httpContextAccessor;

    // 构造函数注入依赖
    public ZendeskAuthController(ITokenService tokenService, IHttpContextAccessor httpContextAccessor)
    {
        _tokenService = tokenService;
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task<IActionResult> RedirectToZendesk()
    {
        var user = _httpContextAccessor.HttpContext.User;
        // 构造Token创建请求
        var tokenRequest = new TokenCreationRequest
        {
            Subject = user,
            // 替换为你的Zendesk要求的Audience
            Audience = "https://your-domain.zendesk.com",
            // 额外添加Zendesk要求的自定义声明
            Claims = new List<Claim>
            {
                new Claim("name", user.Identity.Name),
                new Claim("email", user.FindFirstValue(ClaimTypes.Email)),
                new Claim("external_id", user.FindFirstValue(ClaimTypes.NameIdentifier))
            },
            // 有效期设为3分钟
            Lifetime = 180,
            // 复用IdentityServer默认的签名凭证
            ValidatedRequest = new ValidatedRequest()
            {
                IssuerName = "你的IdentityServer发行者地址",
                SigningCredentials = await _tokenService.GetDefaultSigningCredentialsAsync()
            }
        };

        // 生成Token
        var token = await _tokenService.CreateTokenAsync(tokenRequest);
        string jwtToken = await _tokenService.CreateSecurityTokenAsync(token);

        // 拼接Zendesk回调地址,替换为你的Zendesk回调端点
        var zendeskRedirectUrl = $"https://your-domain.zendesk.com/access/jwt?jwt={jwtToken}";
        return Redirect(zendeskRedirectUrl);
    }
}

注意事项

  • 需要在Program.cs/Startup.cs中注册IHttpContextAccessor服务,ITokenService为IdentityServer默认注册的服务,无需额外配置
  • 生成JWT使用的签名凭证和IdentityServer本身发行令牌的凭证一致,无需额外配置密钥;Zendesk后台配置JWT验证时,签名算法选择RS256,公钥填写你IdentityServer的/.well-known/openid-configuration/jwks端点返回的公钥即可
  • 不要在JWT中放入敏感信息,传输全程使用HTTPS避免令牌泄露

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:39:05