在集群上运行 OpenId 提供程序时消息签名无效
Posted
技术标签:
【中文标题】在集群上运行 OpenId 提供程序时消息签名无效【英文标题】:Invalid message signature when running OpenId Provider on Cluster 【发布时间】:2010-03-24 14:13:13 【问题描述】:简介
我们有一个使用 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 用于对其消息进行签名的密钥,以便客户端在同一会话期间信任来自集群中所有服务器的响应?
【问题讨论】:
我认为我们有同样的问题:***.com/questions/2505565/… 我们遇到了类似的问题,但我们选择创建一个非常简单的 nonce 存储,并且在我们的农场/花园设置中运行良好。但我们现在遇到的问题是我们自己的 Provider,我们正试图将其转移到农场,而不是 RP。 【参考方案1】:您必须实现IProviderApplicationStore
并将此对象的一个实例传递给您创建的OpenIdProvider
实例,或者在您的web.config 文件中设置存储类型。您对该接口的实现必须提供对您网络场中所有服务器共享的数据库的访问权限。
【讨论】:
当然,现在你这么说似乎很明显,特别是因为我们已经为 RP 做了同样的事情。谢谢。 这个界面现在改名为IOpenIdApplicationStore
了。【参考方案2】:
当您创建 OpenIdRelyingParty 时,请确保在构造函数中传递 null。
这会将您的网站置于 OpenID 无状态或“哑”模式。用户登录的速度稍慢(如果您注意到的话),但您不必编写 IRelyingPartyApplicationStore 以允许 DotNetOpenAuth 在您的农场中工作;
var openIdRelyingParty = new OpenIdRelyingParty(null);
【讨论】:
这不是中继方,而是提供者。以上是关于在集群上运行 OpenId 提供程序时消息签名无效的主要内容,如果未能解决你的问题,请参考以下文章
xcode 8.3.2 错误的包标识符、无效的代码签名标识符和无效的代码签名权利