我现在一直在寻找一些东西,但我找不到答案。 WCF 安全最佳实践说尽可能使用 Windows 身份验证。如果您需要签名,这能否提供不可否认性和数据完整性?
(这里最重要的问题是不可否认性。我正在使用 TLS,但试图确定我是否可以通过带有 TLS 或 MLS 的 Windows Auth 提供不可否认性。理论上,TLS 提供跳到跳数据完整性。)
我现在一直在寻找一些东西,但我找不到答案。 WCF 安全最佳实践说尽可能使用 Windows 身份验证。如果您需要签名,这能否提供不可否认性和数据完整性?
(这里最重要的问题是不可否认性。我正在使用 TLS,但试图确定我是否可以通过带有 TLS 或 MLS 的 Windows Auth 提供不可否认性。理论上,TLS 提供跳到跳数据完整性。)
最佳实践指南建议使用 Windows 身份验证,因为它内置于所有 Microsoft 机器中。它不喜欢需要大量基础设施设置的证书。如果您的计算机已加入 Active Directory 域,它应该可以正常工作。
Windows 身份验证使用SPNEGO协商使用哪种身份验证方法,Kerberos或NTLM。只要有可能,客户端和服务器将首先尝试选择Kerberos。否则,将使用NTLM 。
要回答您关于消息是否可以签名的问题,Kerberos和NTLM都可用于对消息进行签名和加密。作为 WCF 程序员,它应该对您透明。您需要做的就是将ProtectedLevel设置为 EncryptAndSign。如果您不相信我,您可以在设置 Windows 身份验证后查看网络跟踪。您应该会看到消息已加密。
使用 Windows 身份验证时,WCF 会调用 SSPI 进行身份验证和消息加密。我不会介绍 SSPI 的细节。 这是NTLM加密消息的SSPI 调用和Kerberos加密消息的 SSPI 调用。您可以在 Windbg 中设置一个断点来证明这一点。
尽管在上述链接中没有明确说明,但该链接明确指出,上述 EncryptMessages 方法可以提供数据完整性(签名)和隐私(加密)。
回到您最初关于是否支持 Windows 身份验证的问题non-repudiation
,这实际上是一个更大的问题。 数据签名是必要的,non-repudiation
但还不够。WCF 还提供审计功能来记录操作或事务。这是为了保证用户不能拒绝执行操作或发起交易。因此,为了支持non-repudiation
,您还应该将SuppressAuditFailure设置为 false 以确保审核始终正常运行。