2

我正在使用 .NET 3.5 创建一个智能客户端应用程序。一个通过 WCF 服务连接以从 SQL Server 2008 检索数据的 Winforms 客户端。我需要传递用户名/密码(加密并通过 HTTPS)并返回以下信息:

  • 此用户(电子邮件地址)是否在当前订阅下
  • 所有后续调用我们接下来应该去哪台服务器(穷人的负载均衡)
  • 应该在连接字符串中使用什么服务器/数据库(不需要凭据),因为人们可能会根据订阅等使用不同的数据库。

因此,我在登录时的第一次通话会发送执行查找的凭据。一个可序列化的类将用于创建一个令牌对象(我假设这是处理此问题的方法),它将返回到期、服务器信息、数据库信息。

问题是在所有后续调用中,我是否将此令牌作为参数传递给每个服务合同(Web 方法),或者我是否可以保留所有当前合同并在标头或其他更通用的方法中传递令牌?

您如何建议实施我所描述的令牌系统?

谢谢

4

1 回答 1

1

一方面,我只会TokenID从您的第一次“身份验证”呼叫中返回一个 - 一些唯一 ID,以清楚地识别用户及其相关订阅。无需一直来回发送整套信息 - 只有服务器端的服务需要这些详细信息,因此您可以将该信息留在服务器上,仅在需要时在您的服务器代码中查阅。

因此,第一次调用 - 身份验证调用 - 很可能会根据数据库表和订阅表检查发送的凭据,然后输入该信息(谁在调用,基于什么订阅)以及可能的某种到期日期/time 进入“有效呼叫者”表并从中生成一个 ID(GUID 或其他东西)。您可能想要限制 TokenID 的“生命周期”——例如,它的有效期为 30 分钟左右——这样它就不会在第一次成功调用后被劫持和永久使用。然后,生成的 GUID 作为TokenIDAuthentication 调用返回,并可在每个后续调用中用作标识符。

诸如使用什么数据库服务器之类的东西在来回消息中确实没有位置——它们对服务器端服务代码非常重要——把它留在那里!

将这种不是您调用的真正价值信息的“元信息”放入标头中并在那里搜索它绝对是首选做法。WCF 非常容易地支持这一点——在客户端和服务端使用消息检查器(此处此处的示例),或者使用 OperationContextScope(此处和此处的示例博客文章)——两者都可以正常工作。

于 2010-01-24T20:41:50.430 回答