BaseWeb ISAPI安全模块






2.25/5 (5投票s)
2005年3月22日
4分钟阅读

34219

671
本文详细介绍了一种使用 ISAPI 过滤器来实现类似 ASP 2.0 的 Web 安全的方法。
引言
本文详细介绍了一种使用 ISAPI 过滤器来实现类似 ASP 2.0 的 Web 安全的方法。该项目还包括一个配置管理器、RemoteScripting 框架、用于页面、文本框的基础控件以及一个实用程序类。此外,还重新 rework 了Eric Woodruff 的 Resource Server Handler。
背景
我在专业工作环境中需要一个 Web 开发和安全的基础框架,因此创建了这个类。这是一个修订版的模块,并在 ASP.NET 2.0 模型的基础上进行了改进。
使用代码
要通过 ISAPI 使用安全性,其工作方式类似于 ASP.NET 框架中的基本 ISAPI 处理程序。您必须通过在 web 应用程序的 web.config 文件的 <system.web>
部分中添加以下项目来覆盖处理 .aspx 页面的 machine.config 设置。注意:您确实需要将配置文件中的 <authorization><allow users="*" />
部分设置为默认设置,因为此 ISAPI 过滤器不使用 .NET 安全性。由于 ASP.NET 2.0 包含这些功能,因此我们只是提供了一种模仿它们功能的方法。主要区别在于,在此模块中,我们可以在一个地方支持将多个角色映射到路径和用户。
<!-- DO NOT MODIFY BELOW CODE.... -->
<!-- this is for application security and setup //-->
<httpModules>
<add name="BaseWebSecurity"
type="BaseWeb.HttpModule.BaseSecurityModule,BaseWeb" />
</httpModules>
<httpHandlers>
<add verb="*"
path="BaseWeb.HttpModule.HttpEmbeddedResourceHandler.aspx"
type="BaseWeb.HttpModule.HttpEmbeddedResourceHandler,BaseWeb" />
<add verb="*" path="*.aspx"
type="BaseWeb.HttpModule.PageAuthHandlerFactory,BaseWeb" />
</httpHandlers>
<!-- DO NOT MODIFY ABOVE CODE....-->
<!-- this is for application security and setup //-->
配置文件 BaseWeb.config 应位于应用程序的 /bin 目录下,并将包含您所有的应用程序设置。
<application>
<applicationBrowserSettings
ValidBrowserTypes=
"IE5,IE6x,IEMac5x,Netscape6x,Netscape7x,Opera7x,Mozilla5x" />
<applicationUsers>
<applicationUser name="yourDomain\user"
roles="User" />
<applicationUser name="testmanager"
roles="Manager,Admin" />
<applicationUser name="testAdmin"
roles="Admin" />
</applicationUsers>
<applicationRoles>
<applicationRole type="User" />
<applicationRole type="Manager" />
<applicationRole type="Admin" />
</applicationRoles>
<applicationDirectories>
<applicationDirectory name="root"
path="/TestWebApp/Default.aspx" />
<applicationDirectory name="admin"
path="/TestWebApp/admin/Admin.aspx" />
</applicationDirectories>
<applicationAccessMappings>
<applicationAccessMap role="User"
directory="root" />
<applicationAccessMap role="Manager"
directory="root" />
<applicationAccessMap role="Admin"
directory="admin" />
</applicationAccessMappings>
</application>
可以看到,此配置文件中有五个部分。第一个部分用于设置此应用程序的有效浏览器类型。有效类型包括:IE5、IE6x、IEMac5x、Netscape6x、Netscape7x、Opera7x、Mozilla5x。
<applicationBrowserSettings
ValidBrowserTypes=
"IE5,IE6x,IEMac5x,Netscape6x,Netscape7x,Opera7x,Mozilla5x" />
下一部分用于设置用户。我在此应用程序中使用 Windows 身份验证,您可以构建一个登录页面,在较高层文件夹中设置用户身份验证,并将身份验证 Web 模块保留在较低层文件夹中,该模块和 web.config 存在于此处。
<applicationUsers>
<applicationUser name="testUser" roles="User" />
<applicationUser name="testmanager" roles="Manager,Admin" />
<applicationUser name="testAdmin" roles="Admin" />
</applicationUsers>
下一部分用于设置应用程序角色。请注意,我包含三个默认角色用于测试。
<applicationRoles>
<applicationRole type="User" />
<applicationRole type="Manager" />
<applicationRole type="Admin" />
</applicationRoles>
下一部分用于设置应用程序目录路径。我最初尝试处理目录,但找不到可行的方法,因此最终使用了精确路径。
<applicationDirectories>
<applicationDirectory name="root"
path="/TestWebApp/Default.aspx" />
<applicationDirectory name="admin"
path="/TestWebApp/admin/Admin.aspx" />
</applicationDirectories>
注意:此功能已在 'localhost' 上进行了测试,如果完整的 URL 作为完整的 URL 出现在 context.Request.RawUrl
参数中,则需要将其包含在内才能使路径结构正常工作,如下所示:
http://www.mysite.com/path/default.aspx
最后一个部分用于设置应用程序访问权限。此部分将角色映射到目录路径。正如您所看到的,在此处将角色名称和路径名称进行组合以确定每个角色的访问权限。
<applicationAccessMappings>
<applicationAccessMap role="User" directory="root" />
<applicationAccessMap role="Manager" directory="root" />
<applicationAccessMap role="Admin" directory="admin" />
</applicationAccessMappings>
如果您希望一个角色访问多个路径,只需在 XML 中再添加一个 <applicationAccessMap>
节点,并使用新的路径名称和相同的角色名称,如下所示:
.......
<applicationAccessMap role="Admin" directory="admin" />
<applicationAccessMap role="Admin" directory="root" />
</applicationAccessMappings>
我们如何在代码中实现?好吧,我们获取 Context User Identity Name 参数(来自当前已授权的用户),然后在 BaseSecurityModule.AuthenticateRequest
中进行检查,而在 SessionHandler.ProcessRequest
中,我们使用工厂类检查用户的角色和映射,并将请求中的当前 URL 与任何匹配访问权限的 URL 进行比较。如果没有找到访问权限,我们会在 Response
中写入一个通用的错误页面。
关注点
我在此处包含了许多其他代码,我将在其他文章中介绍。BrowserSniffer
方法很有趣,它提供了一种允许您想要的浏览器访问 Web 应用程序的方法。另一项功能是自定义全局错误处理程序(如果您没有页面访问权限或使用的是不允许的浏览器类型,您会看到它),该处理程序会全局捕获错误并显示自定义错误消息。
此外,还有一个动态脚本平台,可用于在不刷新页面的情况下进行动态页面加载,而无需使用 JavaScript 和支持 IFRAME 的浏览器。我将在后续文章中介绍。
其他控件包括一个具有自身验证控件的文本框,该控件在 BasePage
类中进行验证;以及一个 BasePage
类,该类具有多个有用的方法,并且可以继承以增强页面的功能。WebUtil 也具有一些有用的功能,我在此处无法详述。
您还可以获得一个配置管理器文件,这是我对一直以来所玩弄和完善的代码进行的 rework。
历史
这是我首次向 CodeProject 提交内容,但此代码在我职业生涯的几次不同版本中都发挥了重要作用。我总会保留一个修订版本。