gpt4 book ai didi

authentication - 在子文件夹或虚拟目录上禁用表单例份验证

转载 作者:行者123 更新时间:2023-12-04 15:01:28 24 4
gpt4 key购买 nike

这是我的场景:
我在 IIS (7.5) 中设置了一个使用表单例份验证的网站。我在该网站中有一个子文件夹,用作 WebDAV 共享。我有一个自定义 HTTP 模块来监视我的 WebDAV 请求,并且还充当自定义身份验证级别。当用户尝试将驱动器映射到我的 WebDAV 共享时,此自定义身份验证将首先发送 HTTP 401 质询以获取用户的凭据,然后将凭据从 Basic-Auth header 服务器端解析出来。问题是只有在 Forms Authentication 关闭时才会发送 Basic-Auth header 。
更重要的是,通常当我的 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 的结果。被 Forms Authentication 接管(至少我认为是这样)并重定向到 /login.aspx?ReturnUrl=MySubFolder (如 Fiddler 所示)。
这是我尝试过的:
1) MySubFolder 中添加了单独的 Web.config :
   <configuration>
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
2) 添加了 <location> MySubFolder 的根级 Web.config 中的标记像这样:
   <location path="MySubFolder">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
3) 看着更新 Feature Delegation在 IIS 中。
就个人而言,我对上述解决方案有一些疑问,因为根据我的阅读,它们只是为了允许所有访问,同时仍然启用表单例份验证。 我需要一种方法来在我的子文件夹 上禁用表单例份验证.这可能吗?
我还应该注意,我的子文件夹可能是一个虚拟目录,但不是必须的。我只需要一种在该文件夹上禁用 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>

最佳答案

在您的自定义 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);
}
}

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

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

关于authentication - 在子文件夹或虚拟目录上禁用表单例份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13841924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com