0

好吧,在我的服务的第一个版本中,我有一个双工合同,所以我可以保存客户端的信息,例如它的用户名,如果它已正确登录......等等。目标是只允许调用方法,如果客户端已正确登录。

但是,我需要处理大文件,所以我决定我的服务必须使用流传输模式,但是如果我使用流作为传输模式,我不能使用双工合同。

所以我的问题是我怎么知道我的客户是否已登录?我不想在每次通话中都发送用户名和密码。

此外,出于可扩展性的原因,我想在每次通话时使用一项服务,因此我无法将通话中的信息保存给其他人。或者我可以对所有已记录的客户端使用静态列表?

谢谢。

4

2 回答 2

1

如果它的 TCP 绑定即使您在每个请求中传递用户名和密码,如果将保护级别设置为 EncryptAndSign 也会非常安全。如果设置了 Windows 身份验证模式,则通道会自动将此信息嵌入到每个请求中。

<security mode = "Transport">
            <transport
               clientCredentialType = "Windows"
               protectionLevel = "EncryptAndSign"
            />
</security>
于 2012-06-27T05:24:43.560 回答
1

“简单”的方式:

  1. 在您的服务上创建一个方法,该方法根据用户名和密码对您的用户进行身份验证。如果身份验证成功完成,则生成一个令牌 (GUID)。使用高性能外部缓存系统(例如 CouchBase)来存储您的令牌。

  2. 在每个客户端请求中,将令牌传递到消息头中,以便在您的服务级别上,使用消息检查器可以检索它。一旦你得到它,检查你的外部缓存中是否存在相同的令牌。如果是,那么您可以允许请求继续其行程,如果不是,则抛出异常(错误)以通知客户端使用了错误的凭据。

  3. 当您将令牌保存在缓存设置和过期策略上时,每个成功请求都会更新该令牌。

所有这一切都有一个问题,因为您将在没有会话的情况下使用每个调用,您无法确切知道您的客户端何时停止使用该服务(如 Windows 应用程序/浏览器已关闭)。因此,您的令牌将在缓存中驻留一段时间(由您的缓存策略定义)。

“复杂”的方式:

  1. 使用安全令牌服务 (STS) http://msdn.microsoft.com/en-us/library/ee804740.aspx
于 2012-06-26T19:09:53.057 回答