我有一个经过表单身份验证的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的想法。
有没有人知道如何实现这个目标?
答案 0 :(得分:0)
您不能在ASP.NET中将Forms Authentication
与Windows Authentication
混合使用。您需要为这两者创建单独的应用程序,否则您需要实施Forms Authentication
和Roles
才能正确执行分层访问。
答案 1 :(得分:0)
当天晚些时候,但我在这里发布了一些代码: Combining Forms Authentication and Basic Authentication
基本上你只需要替换
e.Context.Response.End();
与
e.Context.Response.Flush();
e.Context.Response.Close();
关闭Response对象似乎会阻止ASP覆盖重定向。有关完整代码,请参阅上面的链接。