这是我的场景:
我在 IIS (7.5) 中设置了一个使用表单身份验证的网站。我在该网站中有一个子文件夹,用作 WebDAV 共享。我有一个自定义 HTTP 模块来监视我的 WebDAV 请求,并且还充当自定义身份验证级别。当用户尝试将驱动器映射到我的 WebDAV 共享时,此自定义身份验证将首先发送 HTTP 401 质询以获取用户的凭据,然后将凭据从 Basic-Auth 标头服务器端解析出来。问题是只有在 Forms Authentication 关闭时才会发送 Basic-Auth 标头。
更重要的是,通常当我的 HTTP 模块没有找到 Auth Header 时,会发送 401 Challenge(当 Forms Auth 关闭时提示用户输入凭据)。但是,打开 Forms Auth 后,我的 HTTP 模块仍会执行并发送 401 挑战,但 Forms Auth 似乎具有优先权,因此在 Fiddler 中我可以清楚地看到重定向到:
/Account/Login.aspx?ReturnURL=MySubFolder
自定义身份验证的重点是,在将驱动器映射到我的 WebDAV 共享时,我可以允许用户登录到我的站点。我想捕获他们的网站凭据,对其进行身份验证,然后向他们展示目录的内容。
所以我的问题是:
有没有办法在启用表单身份验证的网站中的子文件夹或虚拟目录上禁用表单身份验证?
我已经验证我可以通过在我的网站中创建一个新的应用程序并将子文件夹放在那里,然后在应用程序本身上禁用 Forms Auth 来解决这个问题,但如果可能的话,我真的不希望这样做。
我尝试过的所有事情(如下所列)都导致我请求将驱动器映射到Http://localhost/MySubFolder
被表单身份验证接管(至少这是我认为正在发生的事情)并重定向到/login.aspx?ReturnUrl=MySubFolder
(如 Fiddler 中所示)。
这是我尝试过的:
1)添加了一个单独的 Web.config MySubFolder
:
<configuration>
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
2)<location>
在根级 Web.config 中添加了一个标签,MySubFolder
如下所示:
<location path="MySubFolder">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
3)着眼于更新 IIS 中的功能委派。
就个人而言,我对上述解决方案有一些疑问,因为从我读过的内容来看,它们只是为了允许所有访问,同时仍然启用表单身份验证。我需要一种方法来在我的子文件夹上禁用 Forms Authentication。这可能吗?
我还应该注意,我的子文件夹可能是一个虚拟目录,但不是必须的。我只需要一种在该文件夹上禁用 Forms Auth 的方法。
根据请求,我的 Web.config 文件(站点级):
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="MyConnString" connectionString="Persist Security Info=True;Initial Catalog=MyDB;Data Source=MyServer;User ID=UserName;Password=xxxxxxxxxx;MultipleActiveResultSets=True;"/>
</connectionStrings>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login.aspx" timeout="2880" />
</authentication>
</system.web>
<system.webServer>
<modules runManagedModulesForWebDavRequests="true" runAllManagedModulesForAllRequests="true">
<add name="CustomWebDAVModule" type="CustomWebDAVModule"/>
</modules>
</system.webServer>
</configuration>