【发布时间】:2009-06-02 10:01:47
【问题描述】:
如果我使用 system.net.credentialcache.defaultcredentials 将当前用户凭据传递给 Web 服务,信息将通过哪种方式传输? 我认为它不会是明文,因此必须对凭据进行加密,但它们是如何加密的呢?
【问题讨论】:
标签: c# encryption credentials kerberos ntlm
如果我使用 system.net.credentialcache.defaultcredentials 将当前用户凭据传递给 Web 服务,信息将通过哪种方式传输? 我认为它不会是明文,因此必须对凭据进行加密,但它们是如何加密的呢?
【问题讨论】:
标签: c# encryption credentials kerberos ntlm
这取决于服务器在 HEAD 响应中请求的内容。
例如,如果我对您的 Web 服务执行 HEAD 请求,并且其响应中的 http 标头之一是“WWW-Authenticate: NTLM”,则存储在 DefaultCredentials 中的凭据将使用 NTLM 加密,然后发送完整的 GET/POST/PUT/Whatever。为确保发生这种情况,您需要确保将 Web 服务器配置为请求 NTLM 身份验证。在 IIS 中,这是选择“集成 windows 身份验证”的情况。我不确定 TomCat,但 this post 看起来很中肯。
但是,如果您的网络服务器对特定资源回复“WWW-Authenticate: Basic”(这将涉及以明文形式发送凭据,编码(注意:未加密)为 base64) ,您将收到 ArgumentException,因为通过基本身份验证发送您的帐户凭据被视为安全异常。
Web 服务器也可以配置为接受多种身份验证方法,但您应始终准备好接受其中最弱的一种,因此提供基本身份验证作为“后备”意味着您的一些用户很可能会发送他们的凭据以明文形式显示。
浏览器通常会选择可用的最强方法,我怀疑(但不确定).net 库的行为方式相同。
编辑
只要您的网络服务器仅为您的网络服务请求 NTLM,您就可以确定任何明智的客户端都不会以明文形式发送凭据。使用 .net 框架中的网络类,您可以确保如果您使用 DefaultCredentials,并且不自己手动注入基本身份验证标头,您的凭据将使用 NTLM 加密发送。
他们的凭据将作为一个大的加密混乱到达服务器,发送给除网络服务器之外的任何人,他们将解密它们以查看其中包含当前登录用户的用户名、密码和域。
DefaultCredentials 将发送的凭据取决于请求 DefaultCredentails 的应用程序类型。如果它是在用户帐户下运行的客户端应用程序,则凭据将是该用户的。如果它是与您的 Web 服务通信的 ASP.NET 应用程序,它将使用运行应用程序池的帐户的凭据,默认情况下为NETWORK_SERVICE。
【讨论】: