2008-10-14 45 views
3

我們使用標準的asp.net表單驗證。某些頁面需要用戶登錄;並且這些網頁中的至少一些是通過https發佈的。每頁頂部都有一個搜索控件。當使用這種方法時,即使當前頁面需要登錄,我們也不關心用戶會話是否已過期。從安全頁面上的asp.net控件回發不安全的回帖,同時避免驗證

但是,當前,執行搜索時,內置表單身份驗證會看到頁面被張貼以要求認證並將用戶重定向到登錄頁面,其中前頁而不是搜索結果頁面作爲推薦人。

在這裏繞過安全的最佳方式是什麼?我曾考慮使用PostBackUrl屬性發布到不同的頁面,但如果這不是https,則會顯示「您將數據發佈到不安全的連接」消息,而用戶不喜歡。

感謝您的任何幫助。

編輯:感謝Nick在搜索頁面上使用GET的建議。我們已經這樣做了,但查詢字符串是由搜索輸入控件構造然後重定向的。我們如何構建查詢字符串而不使用回發? (很顯然,javascript是一種選擇,但我希望能夠找到一種替代機制。)

回答

0

正如其他答案中所建議的那樣,最正確的方法是將搜索輸入控件放在一個單獨的表單中,該表單有一個get方法和一個searchresults.aspx操作。然而,這對於aspx很困難,因爲您只能在頁面上使用一個服務器端表單。

最後,我得出的解決方案非常有效,它有一個HttpModule,它發現是否點擊了「搜索」按鈕(通過查看是否存在一個帶有它的id的參數),然後建立起來通過查找條件參數並將其重定向到搜索結果頁面來查詢字符串。這意味着所有認證/授權模塊都被繞過,因爲我們已經在觸發之前調用了重定向到(不安全)的搜索結果頁面。

它稍微脆弱,但對我們來說它工作得很好。

2

對於要確保搜索通過GET請求進行搜索的頁面而言。 (即像谷歌與查詢字符串中的「q」)機會是你正在做一個POST。

因此改變你的

<form method="post" ...> 

<form method="get" ...> 

最大的錯誤最讓開發商與搜索的頁面是做回發。 HTTP被設計爲通過查詢字符串(從而得到名稱)進行查詢或搜索,並獲取表單以發佈到查詢字符串,而不是使用「GET」方法的主體。這樣任何搜索設備都可以使用您的搜索頁面,甚至瀏覽器搜索框。

其次你想爲你創建一個特殊的location config搜索頁面。你把這個添加到你的web.config。

<location path="my-search-page.aspx"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 

這產生了一個頁面和位置標籤內的一切特殊的覆蓋使用完全相同的web.config結構覆蓋web.config中。

您將希望對每個要允許所有用戶訪問的頁面重複此操作。

1

如果搜索結果頁面正在執行回發,頁面加載事件將在點擊搜索按鈕之前觸發。

因此,如果他們所在的頁面需要登錄,那麼登錄命令將在搜索按鈕單擊事件返回到登錄屏幕之前運行。

有幾種方式這一輪讓搜索一個普通的HTML表格並itperform一個GET不是POST和「尼克」

的Ort如果整個頁面是一個.NET的回發窗體裏面,你會提到需要將搜索按鈕事件添加到頁面加載的重載,因此它首先觸發。

這個網站有一個很好的文章,像循環和它的覆蓋頁面。 http://www.15seconds.com/issue/020102.htm