【问题标题】:Passing a username and password with every WCF request在每个 WCF 请求中传递用户名和密码
【发布时间】:2012-06-30 02:04:03
【问题描述】:

我有一个表,其中包含允许访问 WCF 服务的所有用户名及其哈希密码。

使用消息级安全性并在每个请求中将用户名和密码作为加密正文的一部分传递是否存在问题?

为什么几乎没有人建议将此作为身份验证选项?

编辑澄清:

将此与使用传输安全性和证书进行对比,您必须在每个请求中发送用户名和密码作为 ClientCredentials 的一部分。

如果消息级别的安全性提供机密性、完整性和身份验证,那么为什么使用证书是更好的选择?将凭据作为加密正文的一部分传递而不是通过 ClientCredentials 传递有什么缺点?

【问题讨论】:

  • 我有兴趣了解您选择哪个选项?

标签: wcf wcf-security


【解决方案1】:

在每个请求中传递密码都会进行攻击,有人设法读取传输的内容。如果他们得到密码,他们可以随时登录。如果他们愿意,他们甚至可以更改密码。使用会话 ID,他们只能劫持会话,只要它处于活动状态(并且无法访问更好的受保护区域,例如更改密码区域,您必须通过再次提供密码来重新确认)。为了防止密码被盗,您必须更改密码(并记住新密码)。要抵消被劫持的会话 ID,您只需结束会话。无论如何,您永远不会记得会话 ID。此外,如果您一次又一次地发送密码,则需要始终将密码存储在客户端应用程序中的某个位置。这是攻击者可以从中获取密码的另一个地方。

被劫持的密码实际上更糟糕,因为通常相同的密码用于多个不同的应用程序。

除此之外,您通常会使用一种速度特别慢的算法来对密码进行哈希处理(这使得 猜测 密码变得更加困难,因为您必须等待。您d 可能想在每个时间单位对密码添加有限的尝试次数,以排除字典攻击。这与您的想法不太吻合。

我会说总体而言这是一个坏主意,无论是独立还是使用的框架都始终发送密码,这更像是客户端/服务器应用程序的原则。既然有像带有 ID 的会话这样的技术,为什么不使用它们。这并不比一直验证密码更复杂。

【讨论】:

  • 如果在邮件正文中加密,他们如何获得哈希密码?至于有人试图使用字典来破译密码,这不是每种身份验证方法都存在的问题吗? “有一些技术,比如带有 ID 的会话”你能指出一个带有示例的页面吗?
  • @manuel 只有当他们阅读正文时——但这通常会由于各种原因而发生。如果发生这种情况,我解释了为什么使用密码比使用会话 ID 更糟糕。您应该尽可能少地使用密码,而不是在用户不知道您这样做的情况下使用(用户应该控制何时使用密码。如果可能,请不要存储它)。对于原则,您可以从 en.wikipedia.org/wiki/Session_ID 开始 - 那里应该有大量的网站,它几乎用于您可以登录的每个网站。
  • 目前还不清楚你建议的模式是什么。是不是每次调用服务,如果会话不活跃,就会抛出错误,然后捕获错误,发送用户名/密码,然后再次调用?
  • @manuel 我不确定您的具体服务,因为我既不知道 wcf 也不知道您的应用程序。但我的意思是:第一次调用应用程序:使用用户名/密码登录,答案是 sessionID(创建会话)。然后打很多电话来做你的工作,给每个电话都提供 ID。最后:注销,结束服务器上的会话(使 ID 无效)。当然,这只有在您确实在短时间内拨打多个电话时才真正有意义。通过不支持它们的协议(如 http)实现会话是一种正常的方式
  • 不要粗鲁,但这个问题是 WCF 特有的。
【解决方案2】:

@kratenko 是对的,在每条消息中发送密码并不是一个好方法,尽管我同意你的观点,但从加密消息中获取密码并不是一件容易的事。您可以做的是对 WCF 通信使用双重安全性,即消息安全性和传输安全性 (SSL)。这是一个解释如何实现它的链接:http://www.dotnetfunda.com/articles/article891-6-steps-to-implement-dual-security-on-wcf-using-user-name-ssl.aspx

您还有其他选择,例如:仅在安全通道 (SSL) 上发送您的用户凭据一次,并根据用户身份验证的成功生成一个您发送回客户端的令牌。在这种情况下,对于任何进一步的请求,客户端必须在自定义标头中提供该令牌。在服务级别,您可以将生成的令牌保存在高性能缓存存储系统(例如 Couchbase)上,因此对于每个传入请求,您都将客户端提供的令牌与缓存中的令牌进行比较。通过这种方式,您可以一直保持服务无状态。如果您不喜欢这个想法,那么您可以选择使用 STS(安全令牌服务)。

【讨论】:

  • 我理解您关于会话的观点,并且被劫持的会话可能比被劫持的密码哈希造成的破坏要小。让我烦恼的是,为什么 WCF 用户名/密码认证的每个示例都使用在每次调用时使用客户端凭据发送用户名和密码的模式?我的猜测是,实现会话模式需要两次访问服务器(一次检查会话是否处于活动状态加上调用)或进行调用并检查服务器是否返回会话过期错误。
  • 消息安全性为端到端通信提供安全性。这意味着消息传输中涉及多少中介并不重要。此外,消息安全性基于解决互操作性和常见攻击(例如:DOS)的行业标准。通常消息安全用于互联网应用程序。请注意,对于聊天应用程序,由于每条消息的加密,消息安全性会增加开销。
  • 另一方面,传输安全对整个通道通信进行加密。传输安全的主要特征是:完整性、隐私性和身份验证。您还必须选择使用混合传输安全性,它结合了消息安全性和传输安全性,但它有一个缺点,它仅在点对点通信中受到保护(由于传输安全性)。
  • 如果你真的想用整个核掩体发送你的消息,你可以选择两个安全选项((那个 DUAL 东西),但这会增加一个很大的开销,必须加密通道和每条消息.我在答案中提到的令牌概念与会话无关。检查STS(安全令牌服务)概念。注意它根本不需要两个请求。你唯一需要做的就是一种特殊的方法是根据用户名和密码(身份验证)获取令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2020-09-09
  • 2018-05-01
  • 2013-12-23
相关资源
最近更新 更多