3

我们正在使用标准的 asp.net 表单身份验证。某些页面需要用户登录;并且这些页面中至少有一些是通过 https 传递的。每个页面的顶部都有一个搜索控件。使用这个时,我们不关心用户的会话是否过期,即使当前页面需要登录。

但是,目前,在执行搜索时,内置表单身份验证会看到被发布到的页面需要身份验证,并将用户重定向到登录页面,并以前一页而不是搜索结果页作为引荐来源。

绕过这里的安全性的最佳方法是什么?我考虑过使用 PostBackUrl 属性发布到不同的页面,但如果这不是 https,您会收到“您正在将数据发布到不安全的连接”消息,这是用户不喜欢的。

谢谢你的帮助。

编辑:感谢尼克关于在搜索页面上使用 GET 的建议。我们已经这样做了,但是查询字符串是由搜索输入控件构造然后重定向的。我们如何在不使用回发的情况下构建查询字符串?(显然 javascript 是一种选择,但我希望找到一种替代机制。)

4

3 回答 3

2

对于搜索页面,您要确保搜索是通过 GET 请求进行的。(例如,查询字符串中带有“q”的 google)您可能正在执行 POST。

所以改变你的

<form method="post" ...>

<form method="get" ...>

大多数开发人员在搜索页面上犯的最大错误是回帖。HTTP 旨在通过查询字符串(因此名称)进行查询或搜索,并获得一个表单以发布到查询字符串而不是您需要使用“GET”方法的正文。这样任何搜索设备都可以使用您的搜索页面,甚至是浏览器的搜索框。

其次,您想为您的搜索页面创建一个特殊的位置配置。你把它添加到你的 web.config 中。

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

这会为该页面创建一个特殊的覆盖,并且位置标记内的所有内容都使用完全相同的 web.config 结构来覆盖 web.config。

您将希望对要允许所有用户访问的每个页面重复此操作。

于 2008-10-14T16:10:07.790 回答
1

如果搜索结果页面正在执行回发,则会在单击搜索按钮之前触发 pageload 事件。

因此,如果他们所在的页面需要登录,则该登录命令将在搜索按钮单击事件将它们发送回登录屏幕之前运行。

有几种方法可以使搜索成为普通的 html 表单并使其执行 GET 而不是 POST 并由“Nick”提到

或者,如果整个页面都在 .net 回发表单中,您将需要将搜索按钮事件添加到页面加载的重载中,以便它首先触发。

该站点在页面上有一篇很好的文章,例如循环及其覆盖。 http://www.15seconds.com/issue/020102.htm

于 2008-10-14T16:52:54.880 回答
0

正如其他答案中所建议的那样,最正确的方法是将搜索输入控件置于单独的表单中,该表单具有 get 方法和 searchresults.aspx 操作。但是,这对于 aspx 来说很困难,因为您只能在页面上拥有一个服务器端表单。

最后,我找到的解决方案效果很好,它是有一个 HttpModule 来检测“搜索”按钮是否已被单击(通过查看是否存在带有其 id 的参数)然后建立一个查询字符串寻找条件参数并重定向到搜索结果页面。这意味着所有的身份验证/授权模块都被绕过了,因为我们已经在它们被触发之前调用了重定向到(不安全的)搜索结果页面。

它有点脆,但对我们来说效果很好。

于 2008-10-17T14:05:29.223 回答