Windows Azure 上的 WCF session

标签 wcf session authentication azure

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

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

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

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

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

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

谢谢!

最佳答案

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

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

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

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

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

关于Windows Azure 上的 WCF session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931341/

相关文章:

c# - 用于 netTcp 的绑定(bind)的 maxConnections 的最大大小

WCF单元测试

c# - 将 X509 用于 WCF 安全性是否固有地因每个请求的新 channel 而变慢?

asp.net-mvc - 如何使用 Owin/Open ID Connect 添加其他 Azure AD 属性作为声明

wcf - WCF可靠 session 的目的是什么?

asp.net - 在页面之间存储 ID 最多一天?

http - 使 Domino HTTP session 无效/删除?

Firefox 中的 Codeigniter session 不会设置

bash - 暴力破解 16 个字符的 key 需要多长时间

php函数返回0?