Java SPNEGO 身份验证和 Kerberos 约束委派 (KCD) 到后端服务

2024-02-27

我有一个 Java Web 应用程序,它在 Windows Active Directory 环境中对客户端进行 SPNEGO 身份验证。 为了验证用户身份,我们使用来自旧 SPNEGO SourceForge 项目的代码。

String encodedAuthToken = (String) credentials;
LOG.debug("Encoded auth token: " + encodedAuthToken);
byte[] authToken = B64Code.decode(encodedAuthToken);
GSSManager manager = GSSManager.getInstance();

try {
    Oid krb5Oid = new Oid("1.3.6.1.5.5.2");
    GSSName gssName = manager.createName(_targetName, null);
    GSSCredential serverCreds = manager.createCredential(gssName, GSSCredential.INDEFINITE_LIFETIME, krb5Oid, GSSCredential.INITIATE_AND_ACCEPT);
    GSSContext gContext = manager.createContext(serverCreds);

    if (gContext != null) { 
        while (!gContext.isEstablished()) {
            authToken = gContext.acceptSecContext(authToken, 0, authToken.length);
        }
        if (gContext.isEstablished()) {
            // Login succeeded!
            String clientName = gContext.getSrcName().toString();
        }
    }
}

身份验证效果很好,但我们还需要使用约束委派将用户凭据委派给后端服务 (Exchange EWS)。 在我们的 AD 中配置此功能时,看起来差别很小,但事实并非如此。看:AD 委派设置 https://i.stack.imgur.com/cDRsZ.png

此处描述了差异:msdn.microsoft.com/en-us/library/cc246080.aspx?f=255&MSPPError=-2147217396 通过无约束委派,我们可以在调用后端服务时简单地使用可用的委派凭据,这一切都很好:

GSSCredential delegatedCreds = gContext.getDelegCred()
SpnegoHttpURLConnection conn = new SpnegoHttpURLConnection(clientCreds);

通过约束委派,我们无法访问用户 TGT,看来我们需要使用 Java 8 应该支持的 MS-SFU (S4U2proxy) Kerberos 扩展。 我能找到的唯一例子是这个:https://github.com/ymartin59/java-kerberos-sfudemo https://github.com/ymartin59/java-kerberos-sfudemo(感谢伊夫·马丁!)

现在我的问题...在我的身份验证之后,我基本上最终得到了经过身份验证的用户的用户名(请参阅上面代码中的“clientName”)。

我们真的需要在这里使用S4U2self机制来模拟用户吗? 客户端刚刚向我们发送了 Kerberos 服务票证(包含在我无法解码的 SPNEGO 令牌中)。 理想情况下,我们应该能够使用该服务票证和我自己的服务的 TGT 来验证用户身份(使用 S4U2proxy 机制)? 但我不明白怎么办。

所以现在我想知道是否可以将我们的 SPNEGO 身份验证与 S4U2proxy 委托结合在一起?

非常感谢您对此的任何意见。


我实际上最近一直在做类似的事情,但是我使用的是 spring security kerberos。我在github上放了一个例子here https://github.com/tellisnz/collared-kerberos。我发现我需要设置为使用您想要的约束委派和 S4U2Proxy 的关键是确保(如果您使用的是 Oracle/OpenJDK)您设置isInitiator=true在您的 JAAS 配置中,以便当调用 getDelegCred 时您会得到一个 Krb5ProxyCredential。查看评论here https://github.com/openjdk-mirror/jdk/blob/jdk8u/jdk8u/master/src/share/classes/sun/security/jgss/krb5/Krb5Context.java#L542。有了该凭证,您可以使用它代表用户为您必须以正常方式使用的服务创建服务票证令牌,例如this https://github.com/tellisnz/collared-kerberos/blob/master/collared-kerberos/src/main/java/nz/tellis/collared/kerberos/CollaredKerberosTokenFactory.java.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java SPNEGO 身份验证和 Kerberos 约束委派 (KCD) 到后端服务 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • Java Swing:清除JList而不触发监听器

    我的情况如下 我有一个 JList 只要在列表中进行选择 它就会触发搜索 使用 ListSelectionListener 我正在尝试使用以下命令重置列表上的选择list clearSelection 这样做的问题是使用clearSelec
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • JUnit 使用 Mockito 测试异步方法

    我已经使用 Spring Framework 版本 5 0 5 RELEASE 在 Java 1 8 类中实现了异步方法 public class ClassToBeTested Autowired private MyComponent
  • 如何在Spring的applicationContext.xml中指定默认范围来请求范围?

    我想让所有 bean 请求默认作用域 但是 Spring 文档说默认作用域是 Singleton 第 3 4 1 和 3 4 2 节http static springsource org spring docs 2 5 x referen
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • @PreUpdate 不适用于 Spring Data JPA

    我有一个实体 Entity EntityListeners MyEntityListener class class MyEntity 还有听者 class MyEntityListener PrePersist PreUpdate pub
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • Android同步onSensorChanged?

    这是我的问题的后续 Android线程可运行性能 https stackoverflow com questions 36395440 android thread runnable performance 我在理解应用程序的同步方法时遇到
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 从 JTabbedPane 中选定的选项卡获取 JTable

    我有 JTabbedPane 其中包含许多动态生成的 JPanel 其中包含 JTable 如何从选定的 JTabbedPane 选项卡获取 设置 JTable 已尝试使用 JTabbedPane getComponents 但它不包含任何
  • 如何处理将 UTF-8 编码、代码页 = 65001 的文件导入 SQL Server

    在挪威 我们有 3 个非常烦人的角色 它们会造成各种各样的问题 自 sql server 2008 起 Microsoft 决定不再支持代码页 65001 我找到了一个可管理的解决方案 解决使用 OPENROWSET BULK 将 UTF
  • 如何在不使用计时器的情况下在 Windows 服务中进行循环

    我想每 10 秒从 Windows 服务调用一个业务层方法 使用 C 和 NET 完成 但是 我不想使用 Timer Elapsed 事件 因为如果第一个线程 进程仍在运行 它会启动另一个线程 进程 我只需要一个单线程方法 因为对同一业务方
  • ACE 编辑器自动补全大写关键字

    我有一个带有自定义突出显示模式的 ACE 编辑器 基于 sql 模式 一切都工作正常 但我以大写形式定义关键字 当自动完成程序显示可用选项时 它们全部都是小写形式 我检查了旧的 sql 模式 在修改之前 行为完全相同 有什么方法可以将此选项
  • 在 Windows 中通过 OpenSSL 为我的 Android 应用程序创建带有自签名证书的 PKCS#12 文件

    我正在编写一个 Android 应用程序 需要对某些 Web 请求进行 SSL 认证 我需要构建一个 PKCS12 文件 pfx 与自签名证书 我决定使用 OpenSSL 库 但无法在我的计算机 Windows x64 平台 上构建它 我想
  • 即使我在 ADO 中的第一个位置有一个填充的记录集,EOF也会返回 true

    我试图从记录集中的列中获取行 然后将它们插入简单明了的表中 记录集已填充 我使用 MoveFirst 从 rs 的开头开始 但我仍然在开始时得到 EOF true 并且它跳出了 do while 我有一个类似的功能可以工作 但由于某种原因这
  • 如何在不克隆的情况下更改对拥有值的引用?

    我正在练习在阅读这本书时学到的 Rust 概念 我已经能够迭代我的List枚举通过复制Box并分配list到复制的框 但直观上 我觉得必须有一种方法可以 使其指向行中的下一个指针 如果我尝试这样做而不bx clone 像这样 self li
  • 如何在崩溃时创建进程迷你转储而不在 Windows 7 上显式运行 AdPlus?

    我有一个 NET 进程 有时会在某些第 3 方库的本机代码中因 AccessViolationException 而失败 当发生这种情况时 我希望有完整的内存迷你转储 我已阅读此页 http support microsoft com kb
  • 将数值转换为二进制 (0/1)

    我有一个数据框 其中包含不同人的不同种类水果的数量 像下面这样 apple banana orange Tim 3 0 2 Tom 0 1 1 Bob 1 2 2 如何将其转换为二进制矩阵 即如果一个人至少有一个水果 无论他有多少 那么我记
  • 使用 ActiveRecord 连接到 SQL Server

    您是否曾经需要使用 ActiveRecord 连接到 SQL Server 这可能吗 谁能提供一些起点 这是我用的 从这里 http github com rails sqlserver 2000 2005 adapter tree mas
  • 在 R/3.0.2 中安装 minqa 时出错

    我正在安装lme4使用 README md 文件他们的 github 帐户 https github com lme4 lme4我在安装依赖项时失败了 我尝试单独安装它们 但在安装时仍然崩溃minqa包裹 我在 RHEL6 上使用 R 3
  • 数据库插入

    if lines size gt 5 String Actor it next String Bio it next String More Bio it next String Reason it next String Fact it
  • 删除已知提交 ID 的特定提交

    假设我有一个包含以下提交的存储库 git 版本 1 7 1 A gt B gt C gt D gt E我的头在E 现在我想删除 C 同时保持一切相同A gt B gt D gt E 你能帮我看看该怎么做吗 你可以这样做git rebase
  • SOA - 服务应该有多细粒度才能维持性能?

    我正在接手一个项目 从头开始替换一个古老的遗留系统 在我加入之前 该公司聘请了一位顾问 他绘制了系统的基本草图 并大力推行 SOA 这就产生了一长串 实体服务 目的是将它们组成更复杂的服务组合 例如 想要委员会信息的用户可以访问 委员会 服
  • PHP 5.3 + 的 ereg_replace ?

    我已经看到了一个不必重新使用 PHP 5 3 的 ereg 函数的解决方案 PHP 中 eregi 的良好替代方案 https stackoverflow com questions 737198 good alternative to e
  • 如何制作通用类型转换方法

    我想做的是 bool Convert out Object output Object source find type of output convert source to that type if possible store res
  • Pandas:将知识产权解析为国家/地区的最快方式

    我有一个函数find country from connection ip它需要一个 ip 经过一些处理后返回一个国家 地区 就像下面这样 def find country from connection ip ip Do some pro
  • 处理浏览器关闭事件和页面刷新

    在我们的应用程序中 我们需要处理浏览器关闭事件 当用户直接关闭浏览器时 我们应该给他一个警告消息 并根据某些条件直接关闭窗口来阻止他 我们已经通过 body onunload 事件处理了这个问题 问题是我们正在收到警报消息 但在显示警报消息
  • 通用GNU makefile目录路径

    我正在尝试使用通用的 makefile 来合并一些构建信息 我的问题是我想使用不同子目录级别的 makefile 这使得工作目录值 pwd 不可预料的 例如 Makefile common TOP shell pwd COMPONENT D
  • Java SPNEGO 身份验证和 Kerberos 约束委派 (KCD) 到后端服务

    我有一个 Java Web 应用程序 它在 Windows Active Directory 环境中对客户端进行 SPNEGO 身份验证 为了验证用户身份 我们使用来自旧 SPNEGO SourceForge 项目的代码 String en