我有一个 Forms Authenticated Web 应用程序,但我需要对几个服务进行基本身份验证,这些服务都位于特定路径(即“~/Services/”)。
我最初尝试在 web.config 中添加一个带有单独自定义 MembershipProvider 的标签,如下所示:
<location path="Services">
<system.web>
<authentication mode="None" />
<authorization>
<deny users="?" />
</authorization>
<membership defaultProvider="ServicesMembershipProvider">
<providers>
<add name="DefaultMembershipProvider" type="Company.WebProject.DeviceMembershipProvider" connectionStringName="DefaultConnectionString" applicationName="/" />
</providers>
</membership>
<httpModules>
<add name="BasicAuthentication" type="Company.WebProject.BasicAuthenticationModule" />
</httpModules>
</system.web>
</location>
但这是抛出错误:
在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的部分是错误的。此错误可能是由未在 IIS 中配置为应用程序的虚拟目录引起的。
所以我意识到我不允许在位置元素中使用身份验证元素。
阅读本文后,我尝试在 Global.asax 中连接 FormsAuthentication_OnAuthenticate 方法。由于我需要使用基本身份验证,因此我尝试返回 401 以提示浏览器输入基本身份验证凭据。不幸的是,这似乎导致重定向到表单身份验证登录页面(即 loginUrl)。
public void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)
{
string path = VirtualPathUtility.ToAppRelative(e.Context.Request.Path);
if (path.Contains("/Services/"))
{
e.Context.Response.StatusCode = 401;
e.Context.Response.AddHeader("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", "CompanyRealm"));
e.Context.Response.End();
}
}
所以现在我已经没有关于如何在 Forms Authenticated Web 应用程序中的文件夹上实现 Basic Auth 的想法了。
有谁知道如何实现这一目标?