使用基本身份验证在特定文件夹/路径上构建经过身份验证的Web应用程序

时间:2012-07-17 17:14:53

标签: asp.net authentication forms-authentication basic-authentication

我有一个经过表单身份验证的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中配置为应用程序。

所以我意识到我不允许在location元素中使用authentication元素。

在阅读this文章后,我尝试连接到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的想法。

有没有人知道如何实现这个目标?

2 个答案:

答案 0 :(得分:0)

您不能在ASP.NET中将Forms AuthenticationWindows Authentication混合使用。您需要为这两者创建单独的应用程序,否则您需要实施Forms AuthenticationRoles才能正确执行分层访问。

答案 1 :(得分:0)

当天晚些时候,但我在这里发布了一些代码: Combining Forms Authentication and Basic Authentication

基本上你只需要替换

e.Context.Response.End(); 

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

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