フォーム認証された Web アプリケーションがありますが、特定のパス (つまり、"~/Services/") にあるいくつかのサービスで基本認証が必要です。
私はもともと、次のように、パスに別のカスタム MembershipProvider を使用して web.config にタグを追加しようとしました。
<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 要素を使用することは許可されていないことに気付きました。
この記事を読んだ後、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();
}
}
そのため、フォーム認証された Web アプリケーションのフォルダーに基本認証を実装する方法についてのアイデアが不足しています。
これを達成する方法を知っている人はいますか?