我正在使用充当服务器并使用 GSSAPI 进行 kerberos 身份验证的应用程序。
应用正常运行
在启动应用程序时获取凭证
每当客户端发送协商: token
使用 gss_accept_sec_context
接受上下文
调用显示名称以获取用户名,例如 MyName@DOMAIN
当前应用程序正在为每个 session 执行身份验证。
带缓存的 SSO 身份验证
但我想修改应用程序以对第一个 session 执行一次身份验证并缓存某物 以使用某物 重新验证用户。 在这里我无法缓存用户名 (MyName@DOMAIN),因为要再次获取用户名应用程序接受上下文并调用显示名称。
有什么方法可以通过缓存来执行 SSO 身份验证吗?
最佳答案
通过现有安全上下文发送经过完整性验证的消息的能力是访问缓存的凭据建立。成功解包每条新消息后,可以使用 gss_inquire_context()
将源原则等数据与解包上下文相关联。
如果客户端既没有请求新上下文也没有发送无法使用现有上下文解包的消息,则没有收到任何具有完整性的消息,因此服务器应该忽略客户端。 (但是如果底层机制和配置支持委托(delegate),服务器可以代表客户端使用缓存的凭据来执行正在进行的任务。)
组织 channel 和安全上下文之间的关系查找的标准不是 GSS 的一部分;它仅提供一种可选方法来验证 channel 匹配,以防更改与您的应用程序相关。
因此,您通常有一个唯一但不安全的 channel ,该 channel 的任何一方都与其安全上下文相关联。通过让服务器向客户端发送一个不透明的引用,这总是可以被模拟并且更短暂。然后,客户端将其与每个包装请求一起发送,以替换服务器端应用程序对映射的需求,例如池中的安全边界检查等新问题。
我不鼓励您构建一个解决方案来批准身份验证的时间超过系统愿意向您发出安全上下文的时间。通常,创建新的安全上下文对人类用户没有影响,除非这是系统策略的一部分,或者他们使用的底层机制缺乏类似 TGT 的机制。
关于c - 如何在使用客户端发送的 token 接受安全上下文之前获取用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695751/