6

这是我的场景:

我在 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>
4

3 回答 3

5

这个问题已经回答了:Multiple/Different authentication settings in web.config

您不能覆盖位置标签中的根身份验证模式=“表单”标签。使文件夹成为自己的应用程序是最简单的方法。

另一种选择是实现您自己的自定义表单身份验证,并让它忽略您的 webdav 文件夹的重定向。

<authentication mode="None">
于 2013-01-03T19:56:32.230 回答
1

显然您没有在 IIS 中正确设置 WebDAV。

由于您想使用自定义 webdav 模块进行身份验证,我们首先需要确保 IIS 不会干扰您的 WebDAV 请求。

请按照以下步骤操作(请注意,重点在步骤 7 中):

  1. 保持web.config原样(如问题中所述)。

  2. 在 IIS 中启用 WebDav。在 IIS 管理器中选择您的网站。主窗口内打开WebDAV Authoring Rules

    打开 WebDAV 创作规则

  3. 在操作窗格(右侧)中单击Enable WebDAV

    启用 WebDav

  4. 现在选择要启用 WebDAV 的子文件夹(我path3在我的示例中使用),方法是单击它,然后打开WebDAV Authoring Rules.

    打开子文件夹的 WebDAV 创作规则

  5. 单击Add authoring rule...操作窗格(右侧)。

    单击-添加创作规则...-

  6. 在打开的对话框中,确保所有这些都被选中All contentAll usersReadSource然后Write单击OK。这将向具有所有权限的所有用户授予对该子文件夹所有内容的访问权限。

    添加创作规则

  7. 现在是最重要的部分。由于您想通过自定义WebDAV 处理程序处理 WebDAV 身份验证,我们必须明确告诉 IIS不要干扰身份验证。我们如何做到这一点?我们告诉 IIS 允许匿名WebDAV 访问。这样 IIS 不会尝试对用户进行身份验证,并且您的模块可以自由地执行其授权操作。为此,我们需要设置Allow Anonymous Property QueriesTrueunder WebDav settings。接下来的步骤将重点介绍如何执行此操作。

  8. 打开站点根目录WebDAV Authoring Rules

    打开 WebDAV 创作规则

  9. 单击WebDAV settings...

    点击 -WebDAV 设置...-

  10. 设置Allow Anonymous Property QueriesTrue

    设置允许匿名属性查询

  11. 关闭并重新启动您将在其上进行测试的 WebDAV 客户端。这是为了确保它不会缓存来自先前错误配置的连接参数。

  12. 检查您网站的 WebDAV 配置是否按预期工作。:)

于 2012-12-28T15:16:22.783 回答
1

在您的自定义 HTTP 模块中,您可以告诉表单身份验证通过以下方式抑制重定向HttpResponse.SuppressFormsAuthenticationRedirect

public class DavAuthenticationModule : IHttpModule
{
        public void Init(HttpApplication application)
        {
            application.AuthenticateRequest += App_OnAuthenticateRequest;
        }

        private void App_OnAuthenticateRequest(object source, EventArgs eventArgs)
        {
            // Only applies for WebDAV requests.
            var ctx = HttpContext.Current;
            if (!ctx.Request.Path.StartsWith("/dav/path", StringComparison.OrdinalIgnoreCase))
                return;

            // So that forms auth won't do a redirect.
            // Note that it will still attempt to read / parse the forms auth cookie.
            ctx.Response.SuppressFormsAuthenticationRedirect = true;        

            // Now do my own auth.
            DoBasicHttpAuthentication(ctx);
        }
}

FormsAuthenticationModule.Authenticate另一种选择是在 Forms Auth 完全运行之前挂钩事件以进行身份​​验证。这将要求您在 IIS 中寻找模块实例,我没有示例。

这两个选项都基于 .NET 4.6 参考源:http ://referencesource.microsoft.com/#System.Web/Security/FormsAuthenticationModule.cs,ac471f8ac73cdb2b

于 2015-10-26T04:09:41.687 回答