在ASP.NET中处理403禁止错误和身份验证时,开发者经常面临一些挑战。标准的ASP.NET行为在某些情况下可能不够灵活或不够明确。本文将探讨如何通过自定义HttpModules来增强ASP.NET的身份验证和错误处理机制。
开发者经常抱怨ASP.NET缺乏真正的403禁止错误处理,以及FormsAuthenticationModule处理身份验证的方式不够灵活。在处理ScriptModule触及的请求时,问题尤为明显。为了解决这些问题,本文提出了一种改进方案。
通过深入分析ASP.NET 3.5中添加的ScriptModule以及根Web.config文件中的HttpModules,可以更清晰地理解请求是如何通过各个模块循环处理的。这有助于发现代码放置错误和任务复杂化的问题。本文建议对任何对编写身份验证或安全相关代码感兴趣的人进行此类练习,尤其是基于提供程序的特性。
改进后的模块实现了以下功能:
模块的配置通过Web.Config文件中的一个部分完成。可以通过在WebConfig中或通过在请求头中指定mode:disabled来完全禁用该模块。默认行为是为没有请求头或请求头中指定mode:none的未授权请求生成硬403禁止状态,对于具有请求头中mode:script的请求生成硬401和403状态。
如果FormsAuth启用,并且在请求头中找到logout:true,则执行注销操作。如果FormsAuth启用,当前请求没有Forms票据,并且提供了凭据,则尝试登录。
在AuthenticateRequest阶段,FormsAuthentication将解析任何存在的票据到FormsIdentity,并将其与当前请求关联。在PostAuthenticateRequest阶段,当前主体被包装在一个代理主体中,可以操纵IsAuthenticated属性。然后,无论认证状态如何,都将此代理传递给UrlAuthorizationModule,以全面了解请求的认证状态。
如果用户已认证,并且请求的资源因角色或用户名排除而禁止访问,则生成403。如果不是脚本请求,则渲染自定义403错误页面(如果存在)。如果用户未认证,并且请求的资源受保护且是脚本请求,则生成401并写入响应,但随后将请求的状态代码更改为499。
源代码下载包含一个演示应用程序和广泛的集成测试。默认文档列出了不同安全级别的资源链接;匿名、用户和管理员角色。每个工作流都从未认证状态开始。
AccessControlModule可以为FormsAuthentication的默认行为提供更大的一致性和可用性,并允许任何客户端脚本代码以直接的方式利用FormsAuthentication。