2010-08-24 59 views
5

我正在为OpenId提供者和依赖方实现DotNetOpenAuth。在这两种情况下,服务器都在负载平衡器后面,所以对于任何HTTP请求,我们都不能认为我们会碰到同一台服务器。网络农场上的DotNetOpenAuth

看来,DotNetOpenAuth depends on the Session存储未决的请求密钥。由于服务器可能会在请求之间发生变化,因此我们不能依赖标准的InProc会话。不幸的是,我们无法成功实现SQL作为Session的存储。

我的问题是:将PendingAuthenticationRequest存储为客户端cookie是否安全?比使用Session更糟糕吗?

回答

5

ProviderEndpoint.PendingAuthenticationRequest属性仅供您使用,主要用于简单场景。如果它不适合你,一切意味着以另一种方式存储它,完全忽略这个属性。那里没有伤害。

最终,会话由HTTP cookie进行跟踪,所以如果您愿意,可以将验证请求状态完全存储在cookie中,以便它可以在Web场环境中使用。另一种方法是不要求客户端(或服务器)完全跟踪状态,方法是直接在OP端点URL处理所有内容(包括身份验证),或者将OP端点URL中的用户重定向到查询字符串,该查询字符串包含所有您需要跟踪的状态信息。请注意后一种方法,因为您将向用户公开您的状态数据以查看并可能被篡改。

总之,您可能会也可能不会选择将用户会话存储在SQL存储中。这应该没问题。我认为你遇到的问题(我们通过电子邮件讨论过)是,你需要实现你自己的IProviderApplicationStore,它将在所有Web服务器上共享的数据库中存储随机数和关联。这是必须做的,并且与用户会话状态正交,因为它存储在应用程序级别。