这是问题所在。我正在使用ASP.NET Forms Authentication作为帐户余额类型的网站。用户登录后,可以通过访问第三方网站(3pw)对其帐户进行付款。当用户点击进行付款时,会发生以下情况:
当我测试此过程时,我可以在网络日志中看到我正在访问我网站上的一次性付款页面。使用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编写的,我无法控制它的配置。
更新
如果我没有尽可能清楚,我道歉。让我重申一下这些步骤。验证页面的帖子是错误发生的。根据日志文件,对验证页面的请求将被重定向到登录页面。我的Web服务器看到请求进入,尝试提供页面但是意识到用户未经过身份验证,并将请求重定向到登录。这部分让我困惑,因为我认为服务器会查看用户是否经过身份验证,因为他们仍然是因为cookie仍然存在,所以提供请求的页面。
也许我并不完全了解整个过程,但是自从我的登录用户发出对3pw的请求后,3pw的任何请求都不属于我的用户吗?
答案 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>