0

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

  1. 我的网站向传递 id 的 3pw 发出请求。
  2. 3pw 向我的站点发出请求,传递 id 和安全 id。
  3. 我验证东西....
  4. 发生了更多你不需要关心的事情......

当我测试这个过程时,我可以在网络日志中看到我正在访问我网站上的一次性付款页面。使用 Live HTTPHeaders 之类的东西,我可以看到对 3pw 网站的请求(步骤#1)。然后网络日志显示从 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 请求。

发生错误的是验证页面的帖子。根据日志文件,对验证页面的请求被重定向到登录页面。我的 Web 服务器看到请求进入,尝试为页面提供服务,但发现用户未通过身份验证,并将请求重定向到登录。这部分让我感到困惑,因为我认为服务器会查看用户是否已通过身份验证,并且由于 cookie 仍然存在,因此它们仍然存在,因此提供请求的页面。

也许我不完全了解整个过程,但是由于我的登录用户对 3pw 的请求是由我的登录用户发起的,所以从 3pw 向我的站点返回的任何请求是否仍属于我的用户?

4

3 回答 3

0

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

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

编辑:

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

有几种方法可以解决这个问题,如 Daniel Auger 建议的一种方法,您可以accountPostback.aspx向所有人开放您的页面。这可能对您来说足够好。

如果你想锁定一点,我想你可以做这样的事情(假设第 3 方网站有一个静态 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 地址,这将不起作用,您将被迫只允许所有人访问该页面。

于 2009-02-13T22:01:32.600 回答
0

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

请澄清...谢谢!

于 2009-02-13T22:09:04.127 回答
0

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

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

  <location path="accountPostback.aspx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
于 2009-02-14T19:21:17.767 回答