我们有一个现有的可公开访问的Web应用程序,其中包含用户控件,数据访问库,图形等。我们希望创建一个新的安全部分来访问一些已有的资源。
最初我们创建了网站的新部分作为虚拟目录(我们希望)允许我们访问父网站的资源。我们将相应的位置信息添加到基本web.config(身份验证和授权),但我们继续看到以下错误“解析器错误消息:使用注册为allowDefinition ='MachineToApplication'的部分超出应用程序级别是错误的。错误可能是由于虚拟目录未在IIS中配置为应用程序引起的。“
为了响应该错误,我们将目录创建为新应用程序。这允许我们正确地进行身份验证,但缺点是无法访问父目录中的任何资源(因为它超出了应用程序范围)。
有没有办法保护网站的新部分,同时利用现有的资源?
答案 0 :(得分:5)
在您网站根目录的web.config文件中,如果添加:
<location path="relativePathToDir">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
这对我使用FormsAuthentication有用,如果未经过身份验证,用户会被重定向到默认登录页面
答案 1 :(得分:3)
我输入了一个摘要,因为很多人都遇到了与子文件夹身份验证相同的情况。
子文件夹授权
方案
假设主页不应该提示登录对话框。它应该让用户无需登录即可通过。但是,在相同的应用程序中,可能在另一个文件夹中,另一个页面需要使用用户网络登录ID来检查用户对数据库表的许可。默认情况下,IE会将所有网站仅用主机名称为Intranet。通过默认的Intranet设置,如果使用Windows身份验证,它将不会提示登录对话框并将用户登录名和密码传递给应用程序。但是,棘手的一方是,如果应用程序有一个实际域,IE会认为它是一个Internet站点,如果使用Windows身份验证,它将提示登录和密码。
不使用Windows身份验证为Internet站点提供登录对话框的唯一方法是在IIS中打开匿名身份验证。但是,您将失去捕获登录信息的能力,因为匿名优先于Windows身份验证。好消息是有一种方法可以解决这个问题。如果应用程序子文件夹需要捕获登录信息,则需要覆盖web.config中Location元素中的父授权。
1在IIS中,按如下方式配置身份验证:
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>
答案 2 :(得分:1)
删除该应用程序,然后将其添加到顶级web.config:
<configuration>
<system.web>
<!-- applies application wide -->
</system.web>
<location path="securedirectory" allowOverride="false">
<system.web>
<!-- applies only to the path specified -->
</system.web>
</location>
</configuration>