这就是问题所在。我正在为帐户余额类型的网站使用 ASP.NET 表单身份验证。用户登录后,他们可以通过访问第三方网站 (3pw) 对他们的帐户进行付款。当用户点击付款时,会发生以下情况:
- 我的网站向传递 id 的 3pw 发出请求。
- 3pw 向我的站点发出请求,传递 id 和安全 id。
- 我验证东西....
- 发生了更多你不需要关心的事情......
当我测试这个过程时,我可以在网络日志中看到我正在访问我网站上的一次性付款页面。使用 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 编写的,我无法控制它的配置。
更新:
如果我不够清楚,我深表歉意。让我重述一下步骤。
- 用户登录我的网站并通过身份验证。
- 用户转到我网站上的一次性付款页面。
- 在一次性付款页面上,用户单击“付款”按钮。
- Make Payment 按钮向 3pw 发出 GET 请求,并在查询字符串中传递一个 id。
- 3pw 看到请求并向我网站上的验证页面发出 POST 请求。
发生错误的是验证页面的帖子。根据日志文件,对验证页面的请求被重定向到登录页面。我的 Web 服务器看到请求进入,尝试为页面提供服务,但发现用户未通过身份验证,并将请求重定向到登录。这部分让我感到困惑,因为我认为服务器会查看用户是否已通过身份验证,并且由于 cookie 仍然存在,因此它们仍然存在,因此提供请求的页面。
也许我不完全了解整个过程,但是由于我的登录用户对 3pw 的请求是由我的登录用户发起的,所以从 3pw 向我的站点返回的任何请求是否仍属于我的用户?