我正在使用.NET 3.5创建智能客户端应用程序。 Winforms客户端通过WCF服务连接以从SQL Server 2008检索数据。我需要传递用户名/密码(加密并通过HTTPS)并返回以下信息:
因此,我在登录时的第一个电话会发送执行查询的凭据。可序列化的类将用于创建令牌对象(我假设这是处理此问题的方法),它将返回到期,服务器信息,数据库信息。
问题在于所有后续调用我是否将此标记作为参数传递给每个服务合同(Web方法),还是可以保留所有当前合同,并在标头或其他更通用的方法中传递令牌?
您如何建议实施我描述的令牌系统?
谢谢
答案 0 :(得分:1)
首先,我只会返回一个TokenID
- 一些唯一ID,以便从第一次“身份验证”调用中清楚地识别用户及其相关订阅。无需始终来回发送整套信息 - 只有服务器端的服务需要这些信息,因此您可以将该信息保留在服务器上,并在需要时仅在服务器代码中查阅。
因此,第一次调用 - 身份验证调用 - 很可能会针对订阅表检查针对数据库表发送的凭据,然后将该信息(谁根据什么订阅调用)以及可能某种类型的到“有效呼叫者”表中的到期日期/时间并从中生成ID(GUID或其他内容)。您可能希望限制TokenID的“生命周期” - 例如它有效30分钟左右 - 因此在第一次成功通话后不会被永久地劫持和使用。然后,生成的GUID将从Authentication调用返回TokenID
,并可在每次后续调用中用作标识符。
使用什么数据库服务器的事情在消息来回中确实没有位置 - 它们对服务器端服务代码非常重要 - 只需将其留在那里!
绝对优先考虑的做法是将这些不是真正有价值信息的“元信息”放入标题中,然后在那里搜索它。 WCF非常好地支持这一点 - 在客户端和服务端使用消息检查器(sample for that here和here),或者使用OperationContextScope(示例blog post here和here) - 两者都很好。