【问题标题】:WCF Single Authentication Multiple EndpointsWCF 单一身份验证多个端点
【发布时间】:2015-01-09 13:21:22
【问题描述】:

在创建 WCF 服务应用程序时,我已经为自定义身份验证实现了 UserNamePassValidator,这可以按预期工作。

但由于服务上的大量功能,我已将其解耦为不同的服务合同,例如库存管理服务、位置管理服务、任务管理服务等,然后我将它们暴露在不同的端点上在同一个服务中。

这似乎工作正常,但是我更喜欢使用一个端点进行身份验证,并在所有端点上维护此会话状态。目前发生的情况是我对一个端点进行身份验证,然后我可以访问该服务合同的功能,但如果我要连接到另一个端点,则需要我再次进行身份验证。

我当前的关键解决方案是在客户端的表单之间传递 ClientCredentials 以进行身份​​验证,尽管它使用消息安全性,因此它们通过网络进行加密,这显然不是一个理想的解决方案。

第一部分有解决方案吗?如果没有,在客户端将用户输入的凭据存储在内存中(在运行时)的最佳做法是什么。

【问题讨论】:

    标签: c# web-services wcf authentication


    【解决方案1】:

    您可以实现类似于 WS-Federation 的方案。它是一种针对服务级别的联合安全性。

    • 首先,您的身份验证端点应称为 STS(安全 令牌服务)。它所做的是身份验证并返回安全性 给客户的令牌。

    • 其次,所有服务端点都应该信任 STS。什么时候 调用端点,您应该传入 STS 的安全令牌 提供以便端点能够读取该令牌并 识别令牌是由受信任的 STS 颁发的。

    我已经在https://github.com/khoanguyen/Test-WS-Federation 使用 Thinktecture 实现了一个,但很抱歉我没有给出解释,您需要对 WS-Federation、Thinktecture 和 WIF 进行一些研究。但是你应该知道这是可以做到的。


    我用于移动项目的 REST 服务的轻量级解决方案如下:

    • 我设置了一个身份验证端点。该端点拥有一个 DSA 私钥/公钥对。当客户端通过身份验证时,此端点生成一个令牌并使用 DSA 私钥对其进行签名。然后我将签名和令牌组合在一起,并将其作为安全令牌返回给客户端。

    • 在服务端点,我给了他们 DSA 公钥(来自身份验证端点的密钥对)。 DSA 公钥用于验证安全令牌。

    • 当客户端调用服务端点时,它会将安全令牌作为 HTTP 消息的标头附加。然后,服务端点读取标头以检索安全令牌 -> 从安全令牌中提取令牌和签名 -> 使用 DSA public 进行验证。

    生成令牌的策略取决于您的需要。就我而言,我的令牌包含客户的用户名、到期时间戳。通过使用 DSA,黑客可以提取所有令牌的数据,但他们无法更改它,因为他们必须拥有 DSA 私钥才能对更改的令牌进行签名。我们的工作只是将私钥保密,不要在令牌中留下任何敏感信息(例如密码)。

    这是非常便宜的方式。我不需要访问数据库来验证用户,只需确保获得了一个有效的安全令牌,令牌的数据只是为了额外的需要,你甚至可以生成一个随机令牌并对其进行签名。不需要会话状态。

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2015-06-13
      • 2011-04-09
      • 2013-10-07
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多