.net DotNetOpenId—;使用编程和web登录获取重播攻击失败

.net DotNetOpenId—;使用编程和web登录获取重播攻击失败,.net,openid,dotnetopenauth,.net,Openid,Dotnetopenauth,我正在向系统添加可选的OpenID身份验证。使用DotNETOpenID,一切工作都很顺利。然而,我遇到了一个问题: 用户使用标准登录(FormsAuthentication)登录web应用程序 用户将一些OpenID与帐户关联(我们在此处使用编程OpenID登录来获取声明的身份) 用户注销FormsAuthentication并使用OpenID(使用登录控件)重新登录 在最后一步,我们得到了一个重播攻击错误。我怀疑OpenID在应用程序存储中保存了一些信息(用于请求),这些信息用于获取以前的请

我正在向系统添加可选的OpenID身份验证。使用DotNETOpenID,一切工作都很顺利。然而,我遇到了一个问题:

  • 用户使用标准登录(FormsAuthentication)登录web应用程序
  • 用户将一些OpenID与帐户关联(我们在此处使用编程OpenID登录来获取声明的身份)
  • 用户注销FormsAuthentication并使用OpenID(使用登录控件)重新登录
  • 在最后一步,我们得到了一个重播攻击错误。我怀疑OpenID在应用程序存储中保存了一些信息(用于请求),这些信息用于获取以前的请求,而不是启动新的请求

    有人能帮忙解释一下这个问题吗


    如果问题是我如何理解它,那么在使用编程登录成功地将OpenID绑定到帐户后(假设我手头有成功的请求),我如何清理这个特定的状态信息?

    您测试的是哪个提供商?老实说,这听起来像是本案中最有可能有罪的一方,因为它构成了openid.response\u nonce值。另一个可能的地方是,您是否(碰巧)维护了URL中第一次和第二次登录之间的所有openid.*查询字符串参数?例如,在用户输入OpenID之前的第二个登录页面上,页面URL中是否有OpenID.*参数?如果是这样的话,这很可能就是问题所在,可以通过编程页面解决,在尝试登录后导致一个干净的重定向来清除这些问题。

    好的,在添加Session.about()之后,实际问题似乎消失了(并稍微清理了验证逻辑)在第一次分配OpenID和使用它进行实际身份验证之间。

    首先,在您的复制步骤中,您提到用户使用编程登录登录,然后使用登录控件登录。那么这两个不同的登录页面,一个是编程的,另一个是使用
    OpenIdLogin
    控件的?还是同一个编程登录页面?我不确定这是否重要,但我只是想在脑海中清楚地了解你的情况。嗨,安德鲁,谢谢你的图书馆和回复!1.URL是绝对干净的,被测试的提供商是谷歌。2.只有一个登录页(使用login/pass或Open ID登录控件进行身份验证)。经过身份验证的用户可以访问关联页面,在这里他们可以将一些OpenID绑定到当前帐户。通过对提供者运行编程OpenID请求并将声明的标识Url保存到持久性存储库,可以实现此绑定。这对您有意义吗?在这种情况下,我认为我需要帮助诊断问题的是您描述的整个复制的日志。有关如何获取日志的信息,请参阅。