如何将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
相关产品推荐
相关产品推荐

