WCF 单一身份验证多端点
WCF Single Authentication Multiple Endpoints
在创建 WCF 服务应用程序时,我实现了用于自定义身份验证的 UserNamePassValidator,这按预期工作。
但是由于该服务的大量功能,我将其分离为不同的服务合同,例如库存管理服务、位置管理服务、任务管理服务等,然后我将这些暴露在同一服务中的不同端点。
这似乎工作正常,但我更愿意使用一个端点进行身份验证,并在所有端点上维护此会话状态。目前发生的事情是我向一个人进行身份验证,然后我可以访问该服务合同的功能,但如果我要连接到另一个端点,它需要我再次进行身份验证。
我目前的拐杖解决方案是在客户端的表单之间传递 ClientCredentials 以进行身份验证,虽然它使用消息安全性,因此它们通过网络加密,但这显然不是一个理想的解决方案。
第一部分有解决办法吗?如果不是,那么在客户端将用户输入的凭据(在运行时)存储在内存中的最佳做法是什么。
您可以实施类似于 WS-Federation 的方案。它是一种服务级别的联合安全。
首先,您的身份验证端点应称为 STS(安全
令牌服务)。它所做的是身份验证和 return 安全
令牌给客户端。
其次,STS应该被所有服务端点信任。什么时候
调用您应该传入 STS 安全令牌的端点
提供以便端点能够读取该令牌,并且
识别令牌是由受信任的 STS 颁发的。
我已经在 https://github.com/khoanguyen/Test-WS-Federation 使用 Thinktecture 实现了一个,但很抱歉我没有给出解释,您需要研究一下 WS-Federation 以及 Thinktecture 和 WIF。但是你应该知道这是可以做到的。
我正在为移动项目的 REST 服务使用的轻量级解决方案如下:
我设置了身份验证端点。该端点持有 DSA private/public 密钥对。当客户端通过身份验证时,此端点生成一个令牌并使用 DSA 私钥对其进行签名。然后我将签名和令牌组合在一起,return它作为客户端的安全令牌。
在服务端点,我给了他们 DSA public 密钥(来自身份验证端点的密钥对)。 DSA public 密钥用于验证安全令牌。
当客户端调用服务端点时,它会将安全令牌附加为 Header HTTP 消息。然后,服务端点读取 header 以检索安全令牌 -> 从安全令牌中提取令牌和签名 -> 使用 DSA public 进行验证。
生成令牌的策略取决于您的需要。就我而言,我的令牌包含客户的用户名、到期时间戳。通过使用 DSA,黑客可以提取所有令牌的数据,但他们无法更改它,因为他们必须拥有 DSA 私钥才能对更改后的令牌进行签名。我们的工作只是将私钥保密,不要在令牌中留下任何敏感信息(例如密码)。
这是一种非常便宜的方式。我不需要访问数据库来验证用户,只需确保获得有效的安全令牌,令牌的数据只是为了额外需要,您甚至可以生成一个随机令牌并对其进行签名。不需要 session 状态。
在创建 WCF 服务应用程序时,我实现了用于自定义身份验证的 UserNamePassValidator,这按预期工作。
但是由于该服务的大量功能,我将其分离为不同的服务合同,例如库存管理服务、位置管理服务、任务管理服务等,然后我将这些暴露在同一服务中的不同端点。
这似乎工作正常,但我更愿意使用一个端点进行身份验证,并在所有端点上维护此会话状态。目前发生的事情是我向一个人进行身份验证,然后我可以访问该服务合同的功能,但如果我要连接到另一个端点,它需要我再次进行身份验证。
我目前的拐杖解决方案是在客户端的表单之间传递 ClientCredentials 以进行身份验证,虽然它使用消息安全性,因此它们通过网络加密,但这显然不是一个理想的解决方案。
第一部分有解决办法吗?如果不是,那么在客户端将用户输入的凭据(在运行时)存储在内存中的最佳做法是什么。
您可以实施类似于 WS-Federation 的方案。它是一种服务级别的联合安全。
首先,您的身份验证端点应称为 STS(安全 令牌服务)。它所做的是身份验证和 return 安全 令牌给客户端。
其次,STS应该被所有服务端点信任。什么时候 调用您应该传入 STS 安全令牌的端点 提供以便端点能够读取该令牌,并且 识别令牌是由受信任的 STS 颁发的。
我已经在 https://github.com/khoanguyen/Test-WS-Federation 使用 Thinktecture 实现了一个,但很抱歉我没有给出解释,您需要研究一下 WS-Federation 以及 Thinktecture 和 WIF。但是你应该知道这是可以做到的。
我正在为移动项目的 REST 服务使用的轻量级解决方案如下:
我设置了身份验证端点。该端点持有 DSA private/public 密钥对。当客户端通过身份验证时,此端点生成一个令牌并使用 DSA 私钥对其进行签名。然后我将签名和令牌组合在一起,return它作为客户端的安全令牌。
在服务端点,我给了他们 DSA public 密钥(来自身份验证端点的密钥对)。 DSA public 密钥用于验证安全令牌。
当客户端调用服务端点时,它会将安全令牌附加为 Header HTTP 消息。然后,服务端点读取 header 以检索安全令牌 -> 从安全令牌中提取令牌和签名 -> 使用 DSA public 进行验证。
生成令牌的策略取决于您的需要。就我而言,我的令牌包含客户的用户名、到期时间戳。通过使用 DSA,黑客可以提取所有令牌的数据,但他们无法更改它,因为他们必须拥有 DSA 私钥才能对更改后的令牌进行签名。我们的工作只是将私钥保密,不要在令牌中留下任何敏感信息(例如密码)。
这是一种非常便宜的方式。我不需要访问数据库来验证用户,只需确保获得有效的安全令牌,令牌的数据只是为了额外需要,您甚至可以生成一个随机令牌并对其进行签名。不需要 session 状态。