1

フォーム認証された 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 アプリケーションのフォルダーに基本認証を実装する方法についてのアイデアが不足しています。

これを達成する方法を知っている人はいますか?

4

2 に答える 2

0

少し遅くなりましたが、ここにいくつかのコードを投稿しました: フォーム認証と基本認証の組み合わせ

基本的には交換するだけ

e.Context.Response.End(); 

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

Response オブジェクトを閉じると、ASP がリダイレクトをオーバーライドできなくなるようです。完全なコードについては、上記のリンクを参照してください。

于 2013-05-31T03:01:12.727 に答える
0

ASP.NETと混在Forms Authenticationさせることはできません。Windows Authenticationこの 2 つに対して個別のアプリケーションを作成するか、階層型アクセスを実装Forms AuthenticationRolesて適切に行う必要があります。

于 2012-07-17T17:29:29.190 に答える