我输入了一个摘要,因为许多人在子文件夹身份验证方面面临同样的情况。
子文件夹授权
- ASP.NET 只能为一个应用程序提供一种身份验证模式。
- 不同的应用程序不能在它们之间共享资源。
设想
假设主页不应提示登录对话框。它应该让用户在没有任何登录的情况下通过。但是,在同一个应用程序中,可能在不同的文件夹中,另一个页面需要使用用户网络登录 ID 来检查用户对数据库表的权限。默认情况下,IE 将所有只有主机名的网站视为 Intranet。根据其默认的 Intranet 设置,如果使用 Windows 身份验证,它将不会提示登录对话框并将用户登录名和密码传递给应用程序。然而,棘手的是,如果应用程序有一个实际的域,IE 会认为它是一个 Internet 站点,如果使用 Windows 身份验证,它会提示登录名和密码。
不使用 Windows 身份验证提示 Internet 站点登录对话框的唯一方法是在 IIS 中也打开匿名身份验证。但是,您将无法捕获登录信息,因为匿名优先于 Windows 身份验证。好消息是有办法解决这个问题。如果应用程序子文件夹需要捕获登录信息,则需要覆盖 web.config 中 Location 元素中的父授权。
1 在 IIS 中,按如下方式配置身份验证:
- 启用匿名身份验证,
- 启用 Windows 身份验证
2 在 Web.Config 中添加以下内容。
<authentication mode="Windows" />
<authorization>
<allow users="*" />
</authorization>
<!-- secured is the relative subfolder name. deny anonymous user, so only the authenticated login will pass through -->
<location path="secured" allowOverride="true">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>