与第三方网站集成导致表单身份验证问题

时间:2009-02-13 21:38:14

标签: .net asp.net forms-authentication

这是问题所在。我正在使用ASP.NET Forms Authentication作为帐户余额类型的网站。用户登录后,可以通过访问第三方网站(3pw)对其帐户进行付款。当用户点击进行付款时,会发生以下情况:

  1. 我的网站向3pw传递了一个id。
  2. 3pw向我的网站发送请求,传递id加上安全ID。
  3. 我验证了......
  4. 发生了更多你不需要关心的事情......
  5. 当我测试此过程时,我可以在网络日志中看到我正在访问我网站上的一次性付款页面。使用Live HTTPHeaders之类的东西我可以看到3pw网站的请求(步骤#1)。然后,Web日志显示从3pw到我的站点的请求(步骤#2),但是日志中的下一个条目是对我站点的登录页面的新请求。

    login.aspx?ReturnUrl=mypage.aspx
    

    3pw不知道如何处理重定向到登录页面然后失败。问题是为什么我的网站认为当请求从3pw到mypage.aspx时,用户不再经过身份验证?我已经看过我的cookie和我登录时创建的cookie仍然存在。不应该告诉服务器我还是经过身份验证的用户吗?

    这是我在web.config中的内容

    <authentication mode="Forms">
      <forms defaultUrl="~/somepage.aspx" 
         loginUrl="~/login.aspx"
             protection="All"
         timeout="30" 
         name="MyCookieName"
         enableCrossAppRedirects="true"
         requireSSL="true"/>
    </authentication>
    
    <location path="manage">
      <system.web>
        <authorization>
          <allow roles="UserRole" />
          <deny users="?" />
        </authorization>
      </system.web>
    </location>
    

    经过身份验证的用户属于UserRole角色。 3pw请求的页面位于Manage目录中。 3pw不是用.NET编写的,我无法控制它的配置。

    更新

    如果我没有尽可能清楚,我道歉。让我重申一下这些步骤。

    1. 用户登录我的网站并通过身份验证。
    2. 用户转到我网站上的一次性付款页面。
    3. 在一次性付款页面上,用户点击“付款”按钮。
    4. Make Payment按钮向3pw发出GET请求,在查询字符串中传递id。
    5. 3pw查看请求并向我网站上的验证页面发出POST请求。
    6. 验证页面的帖子是错误发生的。根据日志文件,对验证页面的请求将被重定向到登录页面。我的Web服务器看到请求进入,尝试提供页面但是意识到用户未经过身份验证,并将请求重定向到登录。这部分让我困惑,因为我认为服务器会查看用户是否经过身份验证,因为他们仍然是因为cookie仍然存在,所以提供请求的页面。

      也许我并不完全了解整个过程,但是自从我的登录用户发出对3pw的请求后,3pw的任何请求都不属于我的用户吗?

3 个答案:

答案 0 :(得分:0)

您是说第三方网站向您的网站提出请求(第2步)?

如果我理解正确,此请求将不会被验证,因为它不是来自用户,而是来自第三方网站。

修改

根据您更新的信息,我的初步想法是正确的。 ASP.NET运行时无法知道来自第三方网站的请求是“来自用户”,因为它是来自不同位置的单独的POST请求。

有几种方法可以解决这个问题,但是丹尼尔奥格建议您可以向所有人开放accountPostback.aspx页面。这可能对您有用。

如果你想把它锁定一点,我想你可以这样做(假设第三方网站有静态IP地址):

// In Global.asax...
void Authenticate_Request(object sender, EventArgs e)
{
    if (Context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] == System.Web.Configuration.WebConfigurationManager.AppSettings["ThirdPartyWebsiteIP"])
    {
        Context.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity("ThirdPartyWebsite"), new string[] {"AccountPostbackPermission"});
    }
}

并更新您的web.config appSettings:

<configuration>
  <configSections>
    <appSettings>
      <add key="ThirdPartyWebsiteIP" value="127.0.0.1" /> // edit this IP address to match the 3rd party's website's IP address
    </appSettings>
  <configSections>
<configuration>  

以及授权:

<location path="manage">
  <system.web>
    <authorization>
      <allow roles="AccountPostbackPermission" />
      <deny users="?" />
    </authorization>
  </system.web>
</location>

当然,如果该网站使用动态IP地址,这将无效,您将被迫只允许每个人访问该页面。

答案 1 :(得分:0)

你能澄清“请求”是什么意思吗?如果您的意思是他们从服务器向您的服务器发起 GET或POST请求,那么John Rasch是正确的:他们没有您的身份验证Cookie。如果您的意思是重定向到您的网站,那么经过身份验证的用户的浏览器实际上是在发出请求,在这种情况下,它似乎应该正常工作。

请澄清......谢谢!

答案 2 :(得分:0)

如果您希望第三方网站回发到您网站上的页面,则需要在表单身份验证配置中对该页面进行例外处理。您不希望要发布的页面受到保护。

允许资源不受保护的示例:

  <location path="accountPostback.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>