2009-02-13 44 views
0

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

  1. 我的网站向3pw传递一个ID请求。
  2. 3pw做一个请求回我的网站传递ID加一个安全ID。
  3. 我验证的东西....
  4. 更多的事情发生,你不需要关心...

当我测试这个过程中,我可以在网络日志中看到我在我的网站上进入一次性付款页面。使用Live HTTPHeaders之类的东西,我可以看到3pw网站的请求(步骤#1)。然后,网络日志显示3pw到我的网站的请求(步骤#2),但日志中的下一个条目是对我的网站登录页面的新请求。

login.aspx?ReturnUrl=mypage.aspx 

3pw不知道如何处理重定向到登录页面,然后失败。问题是为什么我的网站认为当请求从3pw到mypage.aspx时,用户不再被认证?我看过我的cookies和我登录时创建的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所请求的页面位于管理目录中。 3pw不是用.NET编写的,我无法控制其配置。

更新:

我道歉,如果我不是明确的,因为我可以。让我重述一下这些步骤。

  1. 用户登录到我的网站并进行身份验证。
  2. 用户转到我的网站上的一次性付款页面。
  3. 在一次性付款页面上,用户点击一个付款按钮。
  4. Make Payment按钮向3pw传递一个GET请求,在查询字符串中传递一个id。
  5. 3pw查看请求并向我的网站上的验证页面发出POST请求。

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

也许我不完全理解整个过程,但是由于从我登录的用户发起的对3pw的请求不会从我的用户那里返回到我的站点的任何请求吗?

回答

0

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

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

编辑:

基于你已经更新了信息,我最初的想法是正确的。 ASP.NET运行时无法知道来自第三方网站的请求是“来自用户”,因为它是来自不同位置的全部POST请求。

有几种方法可以纠正这种情况,Daniel Auger建议您可以打开所有人的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> 

当然,如果S ite使用动态IP地址,这将无法正常工作,您将被迫只允许每个人访问该页面。

+0

如果是这样的话,我该如何解决此得到。我讨厌建议,但是我需要使用iframe。 – Notorious2tall 2009-02-13 22:23:54

0

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

请澄清...谢谢!

+0

更新了我的问题。 – Notorious2tall 2009-02-13 22:19:50

0

如果您希望第三方网站回发到您网站上的某个页面,则需要在表单认证配置中为该页面设置例外。您不希望发布的页面受到保护。允许资源的

例如要取消保护:

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