2011-11-28 55 views
0

大图:我被要求为公司的Intranet创建一个搜索引擎。这样的搜索引擎将为内部网上的每个独立应用程序爬行由XML文件提供给它的页面。问题是,整个Intranet使用的是表单身份验证,因此抓取工具必须能够访问每个应用程序,而无需真正拥有用户凭据(例如用户名和密码)。为搜索引擎抓取工具创建表单身份验证Cookie

Intranet中的每个应用程序都有权限管理器控制其访问权限,该权限管理器实质上是ASP.NET自带的默认角色管理器上的一个包装器。每个应用程序都可以定义自己的角色并分配具有这些角色的人员。

请注意,有潜在的数百个应用程序。

爬虫有权访问权限管理器的数据库,因此它知道所有角色是什么。因此,我的想法是让抓取工具创建一个cookie,将其标识为具有每个应用程序的所有角色。

我遇到的问题是这样的:我如何创建一个表单身份验证cookie,它已经在其中创建了角色而没有创建相应的用户(IPrincipal)。

完全有可能我没有完全理解表单身份验证如何工作,如果是这样,请告诉我我可以做些什么不同。

+0

您是否对所有应用程序使用基于声明的身份验证,还是每个应用程序都处理自己的身份验证? –

+0

您想要在爬虫的同一台机器上抓取所有应用,还是需要跨越机器边界? –

+0

将设置什么样的cookie? – noob

回答

4

这可能不是你想听到什么,但是......

我只想有履带像其他人一样进行身份验证。

鉴于这是一个您可以控制的爬网程序,为什么要打击Forms Authentication?看起来合乎逻辑的是,在每个应用程序中创建具有所有必需角色的用户(希望您拥有数百个应用程序的中央管理点,否则我不希望成为管理员那里;-)

如果您执行了任何允许“只是抓取工具”的特殊访问(绕过基于用户的身份验证,基于...什么?抓取工具的用户代理?特定的原始IP?),您创建了一个安全漏洞,黑客可利用它来访问所有Intranet那些已经用用户ID,密码和角色进行了认真保护的应用程序(实际上,由于您建议授予对系统中每个角色的访问权限,安全漏洞尤其广泛)。

+2

@Eric J.的建议的另一个好处是,您不希望抓取工具将索引为“私人”的内容,然后在搜索结果中显示给没有查看这些“私密”内容的用户。通过在用户级别进行身份验证,您可以确切了解该级别的用户将看到的内容。如果你给它一些“神模式”身份验证cookie,稍后当角色/权限在你的用户账户就会变好的时候发生变化时你可能会遇到麻烦。 – BenSwayne

+0

@BenSwayne我们通过控制抓取工具抓取的内容来解决“上帝模式”问题;它具有站点地图的位置列表,并且只抓取这些站点地图中的网页。此外,它可以模拟用户使用搜索的身份验证Cookie查询结果,以确定搜索者是否可以访问该页面。 –

+0

@MatthewJones:随着时间的推移,你将如何保持数百个应用程序的网站地图更新?这些应用程序已经使用角色来确定谁有权访问哪些内容。您的站点地图必须始终保持基本相同的信息。此外,如果某些页面仅向特定用户显示不同/附加内容(例如,在财务角色中还显示薪水...) –

0

在我看来,这个问题还没有很好的定义,(至少对我来说!)。
为什么你需要抓取页面并将它们编入索引,如果它们有精细的权限?如何在不违反权限的情况下显示搜索结果?为什么不通过传递页面索引后端(我的意思是索引数据库记录不是页面)...

+0

“如何在不违反权限的情况下显示搜索结果?”您必须先登录才能使用该搜索,因此当用户搜索时,我们通过获取其登录cookie并使用它来查询结果页来检查前十个结果。如果我们取回404或登录页面或错误页面,我们假设用户无权访问,并从列表中删除该结果;它永远不会显示给用户。 –

1

这听起来像你想要的是一个适当加密的System.Web.Security.FormsAuthenticationTicket(然后被附加到HTTP请求作为一个cookie)。

加密逻辑位于System.Web.Security.FormsAuthentication.Encrypt()中,我认为它使用MachineKey作为加密密钥。也看看GetAuthCookie()逻辑(使用反射器)。

您可能必须编写自己的加密方法版本,但如果您有远程站点的加密密钥的副本,则应该可以执行的操作。您不需要用户的密码 - 只有用户名被编码到票证中。