2009-02-13 42 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>