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

能否从TGS获取TGT票据?Kerberos服务身份模拟实现疑问

Kerberos代理认证问题:获取TGT用于后端服务请求

Kerberos认证流程

Kerberos认证流程示意图

  • Browser请求TGT ticket
  • Browser请求TGS ticket(携带TGT作为请求参数)
  • Browser请求WEB服务器并在HTTP头中发送TGS ticket
  • Web服务器需要代表Browser端用户模拟请求Backend Servcice

第三步:WEB服务器端TGS认证代码

private val authService: AuthenticationService,
private val ticketValidator: SunJaasKerberosTicketValidator,
....
@Throws(AuthenticationException::class)
override fun authenticate(authentication: Authentication): Authentication {
    val token = (authentication as KerberosServiceRequestToken).token
    val ticketValidation = ticketValidator.validateTicket(token)
     ...
    return KerberosServiceRequestToken(
        authenticatedUser, ticketValidation,
        authenticatedUser.authorities, token,
    ).apply {
        details = authentication.getDetails()
    }
}

第四步:问题与当前代码

需求是将前序步骤获取的TGT ticket放入GSS API上下文并传递给后端服务,当前用于LDAP绑定的代码如下:

val ssoConnectionProperties = GSSAPIBindRequestProperties(null, null as String?)
    .apply {
        realm = ...
        kdcAddress = ...
        ticketCachePath = krbTgtPath
        keyTabPath = ...

        setUseKeyTab(true)
        setRequireCachedCredentials(true)
        setUseTicketCache(true)
        setEnableGSSAPIDebugging(true)
    }

val bindRequest: BindRequest = GSSAPIBindRequest(ssoConnectionProperties)
return LDAPConnection(connectionOptions, ssoKdcAddress, ldapConnectionProperties.port)

当前代码可运行,但不清楚如何从之前的步骤获取TGT ticket。

解决方案

  1. 从TicketValidation中提取凭证
    第三步中ticketValidator.validateTicket(token)返回的ticketValidation对象,包含了Kerberos认证后的完整凭证信息,其中就包含用户的TGT。直接从该对象中提取GSS凭证即可:
// 从ticketValidation中获取用户的GSS凭证(包含TGT)
val userGssCredential = ticketValidation.credentials
  1. 将凭证传入GSS API上下文
    修改第四步的代码,直接使用提取到的用户凭证,无需依赖本地票据缓存文件:
// 传入从第三步获取的userGssCredential
val ssoConnectionProperties = GSSAPIBindRequestProperties(null, null as String?)
    .apply {
        realm = ...
        kdcAddress = ...
        gssCredential = userGssCredential // 直接设置用户凭证
        keyTabPath = ...

        setUseKeyTab(false) // 使用用户凭证时无需keytab
        setRequireCachedCredentials(false)
        setUseTicketCache(false)
        setEnableGSSAPIDebugging(true)
    }

val bindRequest: BindRequest = GSSAPIBindRequest(ssoConnectionProperties)
return LDAPConnection(connectionOptions, ssoKdcAddress, ldapConnectionProperties.port)
  1. 关键注意事项
  • 不同Kerberos客户端库中,ticketValidation的凭证属性命名可能略有差异,比如部分库中为gssCredentials,需根据实际库调整
  • 需确保Kerberos KDC已配置Web服务的委派权限,允许其代表用户访问后端服务

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:52:17