10

我有两个独立的自制应用程序需要相互通信。一个是前端应用程序(实际上是asp.net),另一个是会计应用程序的后端接口。后端接口不是专门为此前端创建的——它是许多其他应用程序用来与我们的产品集成的通用接口。

为了方便用户,我们希望在前端应用程序中提供 Windows 身份验证。然而,这意味着我们需要将凭据传递给必须检查它们的后端应用程序。

我们不希望将我们的前端设置为后端的“受信任”应用程序,它可以将自己验证为任何用户。如果前端被黑客入侵,那么它也会危及后端系统。

据我了解,使用 Windows 身份验证执行此操作的一种方法是 Kerberos 委派。但是,这需要为要被委派的用户和进行委派的机器(带有我们前端的服务器)显式启用。默认情况下,这些选项在 Active Directory 中是禁用的,我怀疑许多系统管理员会保留为所有用户启用这些选项。

另外,我不确定这是否是 Kerberos 委托的目的。我不需要我们的前端来模拟正在连接的用户。我只需要证明这个用户已经对我进行了身份验证。

你会怎么做?

4

3 回答 3

8

我不清楚你的用例能做什么和不能做什么,但我可以回答Kerberos 委派的目的是什么的问题。

首先让我们谈谈 Kerberos 在委派之前做了什么。很好地理解这部分很重要,因为它很微妙。

Kerberos 验证网络上两个端点之间通信的两端的身份,这些端点可以是交互式用户或计算机上运行的服务。

这是一种强身份验证,因此它不会允许任何形式的中间人攻击。如果设置正确,端点可以保证它们不会受到损害。到服务名称的级别(如果您连接到一台机器上的 II,它与连接到同一台机器上的 SQL Server 是不同的)。它大量使用现代加密技术并需要使用安全证书。身份验证协议的细节很复杂,现在不值得一提,但它涉及两个身份验证端点和身份验证服务器之间的大约 20 个不同的确认步骤(在 Windows 中,域控制器是身份验证服务器)。

那么委托是什么鬼?

委派是 Microsoft 对 Kerberos 标准的扩展,它允许受信任的来源继续对另一个端点进行身份验证。

这使您可以充当“中间人”-但是必须明确设置许多设置,安装证书等才能使其正常工作。这远非简单。(编辑:这是关于详细信息的另一个 SO 答案 - https://stackoverflow.com/a/954154/215752

因此,例如,您可以让某人对网站进行身份验证,然后让 .NET 代码以同一用户身份连接到 SQL Server以读取具有该用户权限的数据。


现在回答你的问题,因为我不确定你想做什么,我提出三个选择:

1)您想以与在网站上进行身份验证的用户相同的用户身份连接到后端系统。

  • 在这种情况下,Kerberos 委派是完美的——它完全符合您的要求。

2) 您想以与在网站上进行身份验证的用户不同的用户身份连接到后端系统(例如服务帐户)。

  • 在这种情况下,您不需要委托。Kerberos 到网站和 Kerberos(作为不同的用户)到后端会很好用。

3)您有时想以 SAME 用户身份连接到后端系统,而其他时候则以 DIFFERENT 用户身份连接到后端系统。(例如,您需要验证这是后端系统的合法用户,但希望在其他时候作为系统帐户执行受信任的操作。这是(根据我的经验)最常见的用例。)

  • 在这种情况下,您同时使用两者。为需要验证用户身份的连接委派,然后在您需要系统访问后端时恢复到服务帐户身份。(我之前的一个问题详细介绍了如何在 .NET 平台上恢复为系统身份,请参阅如何在 Kerberos 中“取消模拟”(取消委托?)。)
于 2013-09-30T21:00:25.037 回答
0

这是一篇描述 Kerberos 如何工作以及如何设置它的帖子。

ASP.NET 传递 Windows 身份验证凭据

于 2009-10-22T12:08:53.100 回答
0

实际上,Kerberos 委托就是专门为这个用例设计的。但这里的挑战是在遗留系统上制作这个,并且使用您不想更改的 AD 设置。

一种可能的破解方法是让前端仅发送用户和身份验证时间,但后端可以查询 Active Directory 事件日志以确定该用户是否已通过前端身份验证。这需要您使用 WIndows 事件日志 API。还需要使用 AD 中的事件日志设置来记录服务票证的问题。(我记得这是默认设置)-

于 2012-08-06T05:32:49.207 回答