【发布时间】:2009-09-04 13:11:38
【问题描述】:
你可能以前解决过这个问题。
我需要能够在没有会话粘性的环境中使用 open id。服务器确实保留了标头。
我正在使用 ASP.NET MVC 和 dotNetOpenId 版本 3.2.0.9177。尽管在返回响应时第 3 方网站上的身份验证顺利进行,但我收到错误并且身份验证失败。
有什么想法吗?
【问题讨论】:
标签: asp.net-mvc load-balancing dotnetopenauth
你可能以前解决过这个问题。
我需要能够在没有会话粘性的环境中使用 open id。服务器确实保留了标头。
我正在使用 ASP.NET MVC 和 dotNetOpenId 版本 3.2.0.9177。尽管在返回响应时第 3 方网站上的身份验证顺利进行,但我收到错误并且身份验证失败。
有什么想法吗?
【问题讨论】:
标签: asp.net-mvc load-balancing dotnetopenauth
有状态
最优化的方法是为 OpenID RP 所需的“秘密”编写一个实现 IRelyingPartyApplicationStore 的自定义持久性存储,并将您的实例传递给 OpenIdRelyingParty(IRelyingPartyApplicationStore) 构造函数,或将其注册到您的 web.config file。
无状态
适用于大多数情况的更简单的解决方案是改用无状态模式,这样就不需要在您的网络场的服务器之间共享任何状态。
您可以通过实例化OpenIdRelyingParty 来激活无状态模式,并将null 作为您的应用商店实例传入。调用默认构造函数将导致 DNOA 使用其内存存储,这会在服务器场上中断,因此默认构造函数是不够的。
或者,如果您使用的是 ASP.NET 控件,只需在控件上设置 Stateless = true。
【讨论】:
以下是我们启用无状态模式的方式:
var uri = new Uri(Request.Url, Request.RawUrl);
var openid = new OpenIdRelyingParty(null, uri,
Request.HttpMethod == "GET" ? Request.QueryString : Request.Form);
到目前为止似乎工作正常,尽管根据 Andrew 的说法,性能受到了一点影响。不确定这是否重要,因为登录是一种相当罕见的活动。
【讨论】:
使用 DotNetOpenID,您应该能够通过 cookie 将身份验证期间所需的状态保持到客户端。
编辑:我没有任何示例代码,因为我从未在无会话环境中使用 DotNetOpenID,但我会查看此链接,它可能提供您需要的信息:http://code.google.com/p/dotnetopenid/wiki/WebFarmHowto
【讨论】: