c# - WCF 单一身份验证多端点

标签 c# web-services wcf authentication

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

但由于该服务有大量功能,我将其分离为不同的服务契约(Contract),例如库存管理服务、位置管理服务、任务管理服务等,然后我将这些服务暴露在不同的端点上在同一个服务中。

这似乎工作正常,但我更喜欢使用一个端点进行身份验证,并在所有端点上维护此 session 状态。目前发生的事情是我向一个人进行身份验证,然后我可以访问该服务契约(Contract)的功能,但如果我要连接到另一个端点,它需要我再次进行身份验证。

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

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

最佳答案

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

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

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

我已经在 https://github.com/khoanguyen/Test-WS-Federation 上用 Thinktecture 实现了一个但很抱歉,我没有给出解释,您需要研究一下 WS-Federation 和 Thinktecture 以及 WIF。但您应该知道这是可能的。


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

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

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

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

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

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

关于c# - WCF 单一身份验证多端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27861545/

相关文章:

c# - 如何在 Unity 中从 sdcard 写入/读取 txt 文件?

c# - 根据类型切换行为的最佳方式

c# - 为什么锁定我们要更改的对象是一种不好的做法?

c# - 序列化异常 : "Type\...\in assembly\...\is not marked as serializable" appears when I try to serialize ObservableCollection

c# - WCF 客户端代理初始化

c# - 计算报告数据 - C# 通过 Collections 或 SQLite

c# - Java - 通过 Web 服务和 XML 发送可能包含非法字符的 UTF-8 字符串

java - 如何将EAR转换为可执行文件?

c# - 为什么我不能在 .NET asmx Web 服务中公开接口(interface)?

c# - 带有 WCF 的聊天室功能、双工回调与轮询?