1

我有一个 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 的想法了。

有谁知道如何实现这一目标?

4

2 回答 2

0

你不能Forms AuthenticationWindows AuthenticationASP.NET 中混用。您将需要为两者创建单独的应用程序,或者您需要实施Forms AuthenticationRoles正确执行分层访问。

于 2012-07-17T17:29:29.190 回答
0

今天有点晚了,但我在这里发布了一些代码: Combining Forms Authentication and Basic Authentication

基本上你只需要更换

e.Context.Response.End(); 

e.Context.Response.Flush(); 
e.Context.Response.Close(); 

关闭 Response 对象似乎可以防止 ASP 覆盖重定向。有关完整代码,请参见上面的链接。

于 2013-05-31T03:01:12.727 回答