【问题标题】:WCF Sessions on Windows AzureWindows Azure 上的 WCF 会话
【发布时间】:2011-10-28 15:24:34
【问题描述】:

我们的应用架构如下: 1) WCF 服务作为一个门面层,位于服务、业务逻辑和数据访问层之上 2) 每个客户端,无论是 MVC/ASP.NET,还是任何其他类型的应用程序,都有一个 ClientTag,首先需要对其进行身份验证并颁发一个“访问令牌”。然后,客户端将这个令牌与每条消息一起传递到 Facade 层 3) 系统将托管在 Windows Azure 上

使用 WCF 会话可以轻松实现,如下所示: 1) 客户端发起对 WCF 的调用以获取令牌(客户端到 WCF 会话已建立,因此每次后续通信都是相同“对话”的一部分) 2) WCF 对 ClientTag 进行身份验证,颁发令牌,并将其存储为局部变量 3) 客户端将令牌存储在自己的 Session 中,并在每次请求时将其传递给 WCF

问题在于 Azure(由于其高可用性/负载平衡特性)不支持 WCF 会话。所以,问题是我们如何实现这一点。

一种解决方案是使用 AppFabric 缓存来模拟 WCF 层中的会话状态。我们会将访问令牌存储在那里,然后根据客户端传入的内容对其进行验证。这样做的问题是客户端和 WCF 之间没有并发。因此,我们必须在来自同一客户端的每个请求上提前 WCF 会话超时,但我们希望避免在每个请求上更新缓存(可能是数百/秒)。

有什么建议吗?有没有人在 Azure 上实现过类似的东西。任何反馈将不胜感激。

附:不仅会在服务器上进行身份验证,而且还会对每个客户端进行自定义授权。 (某些客户端可能可以访问某些功能,而其他客户端可能没有)。

谢谢!

【问题讨论】:

    标签: wcf session authentication azure


    【解决方案1】:

    我正在实施与此类似的东西,但通过 ACS 使用 OAuth 2.0 作为身份验证架构。

    我所关注的模型是从此处的 MSDN 示例中无耻地被盗复制的:https://connect.microsoft.com/site1168/Downloads/DownloadDetails.aspx?DownloadID=35417。这假设客户端具有用户界面,因此用户可以直接或通过某些第三方身份提供者提供某种用户名和密码。

    这种方法的优点是 WCF 层不需要使用任何类型的会话状态,因此不会对机器密钥或诸如此类的东西进行繁琐的处理。但是,您仍然会得到可以映射到 IPrincipal 的内容,因此,如果您愿意,可以创建自定义 RoleProvider 并以通常的方式使用声明性角色。

    请注意,该示例使用老式的 ASP.NET,并且依赖于不透明(并且可能相当错误)的程序集 Microsoft.IdentityModel.Protocols.Oauth。而且,除非我遗漏了什么,否则我还没有看到它在其他任何地方发布(例如,作为 Windows Identity Foundation 的一部分),所以我怀疑它是相当新的。

    另一种方法可能是再次使用 ACS,这次是对 SAML 令牌进行身份验证,再次遵循 OAuth 2.0 协议。详细信息和示例代码在这里:http://msdn.microsoft.com/en-us/library/windowsazure/hh127795.aspx。这可能更适合没有 UI 的系统。

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      相关资源
      最近更新 更多