2010-03-24 85 views
5

介绍消息无效签名的集群

运行OpenID提供商时,我们有我们使用DotNetOpenAuth组件创建OpenID提供者。当我们在单个节点上运行提供程序时,一切都很顺利,但是当我们将提供程序移动到负载均衡的集群,其中多个服务器正在处理每个会话的请求时,由于DotNetOpenAuth组件似乎使用的是独特的从每个集群节点创建签名。

异常

DotNetOpenAuth.Messaging.Bindings.InvalidSignatureException: Message signature was incorrect. 
    at DotNetOpenAuth.OpenId.ChannelElements.SigningBindingElement.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\SigningBindingElement.cs:line 139 
    at DotNetOpenAuth.Messaging.Channel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 940 
    at DotNetOpenAuth.OpenId.ChannelElements.OpenIdChannel.ProcessIncomingMessage(IProtocolMessage message) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\ChannelElements\OpenIdChannel.cs:line 172 
    at DotNetOpenAuth.Messaging.Channel.ReadFromRequest(HttpRequestInfo httpRequest) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\Messaging\Channel.cs:line 378 
    at DotNetOpenAuth.OpenId.RelyingParty.OpenIdRelyingParty.GetResponse(HttpRequestInfo httpRequestInfo) in c:\BuildAgent\work\7ab20c0d948e028f\src\DotNetOpenAuth\OpenId\RelyingParty\OpenIdRelyingParty.cs:line 493 

设置

我们有机器的配置设置为使用所有群集节点上的同一台机器的关键,我们必须建立一个进程外会话与SQL Server。

问题

我们如何配置使用DotNetOpenAuth签署的消息,因此客户端将在同一会话期间信任来自集群中的所有服务器的响应的关键?

+0

我认为我们有同样的问题:http://stackoverflow.com/questions/2505565/dotnetopenauth-message-signature-was-incorrect – 2010-03-24 18:47:40

+0

我们有一个类似的问题,而是选择创建一个nonce商店,这非常漂亮简单并且在我们的农场/花园设置上运行得非常好。但我们现在面临的问题是我们自己的提供商,我们正试图迁移到农场,而不是RP。 – Garth 2010-03-25 07:13:55

回答

3

您必须实现IProviderApplicationStore,并通过这个对象的实例来创建OpenIdProvider实例,或设置在你的web.config文件存储类型。此接口的实施必须提供对Web场中所有服务器共享的数据库的访问权限。

+0

当然,现在看起来很明显,特别是因为我们已经为RP做了同样的事情。谢谢。 – Garth 2010-03-26 08:14:30

+1

现在这个界面已经被重命名为'IOpenIdApplicationStore'。 – 2012-09-16 21:26:09

1

当您创建OpenIdRelyingParty时,请确保您在构造函数中传递null。

这会使您的网站进入OpenID无状态或“哑”模式。用户登录的速度稍微慢一些(如果你注意到的话),但是你不必编写IRelyingPartyApplicationStore来允许DotNetOpenAuth在你的场中工作;

var openIdRelyingParty = new OpenIdRelyingParty(null); 
+1

这不是中继方,而是提供者。 – Garth 2010-03-24 19:37:46