6

これが私のシナリオです:

フォーム認証を使用するWebサイトをIIS(7.5)でセットアップしました。そのWebサイト内に、WebDAV共有として使用しているサブフォルダーがあります。WebDAVリクエストを監視するカスタムHTTPモジュールがあり、カスタム認証のレベルとしても機能します。このカスタム認証は、ユーザーがドライブをWebDAV共有にマップしようとしたときに、最初にHTTP 401チャレンジを送信してユーザーの資格情報を取得し、次に資格情報がサーバー側のBasic-Authヘッダーから解析されます。問題は、FormsAuthenticationがオフになっている場合にのみBasic-Authヘッダーが送信されることです。

さらに、通常、HTTPモジュールがAuthヘッダーを見つけられない場合、401チャレンジが送信されます(Forms Authがオフになっている場合、ユーザーに資格情報の入力を求めます)。ただし、Forms Authをオンにしても、HTTPモジュールは引き続き実行されて401チャレンジを送信しますが、Forms Authが優先されているように見えるため、Fiddlerでは次の宛先へのリダイレクトを明確に確認できます。

/Account/Login.aspx?ReturnURL=MySubFolder

カスタム認証のポイントは、ドライブをWebDAV共有にマッピングするときに、ユーザーが自分のサイトにログインできるようにすることです。彼らのWebサイトの資格情報を取得し、認証してから、ディレクトリの内容を表示したいと思います。

だから私の質問は:

フォーム認証が有効になっているWebサイト内のサブフォルダーまたは仮想ディレクトリでフォーム認証を無効にする方法はありますか?

Webサイトで新しいアプリケーションを作成し、そこにサブフォルダーを配置して、アプリケーション自体でForms Authを無効にすることで、これを回避できることを確認しましたが、可能であれば、そうしないことをお勧めします。

私が試したすべての結果(以下にリストされています)は、ドライブをHttp://localhost/MySubFolderフォーム認証に引き継がれ(少なくともそれが起こっていると思います)、リダイレクトされるようにマップするという私の要求につながりました/login.aspx?ReturnUrl=MySubFolder(Fiddlerに示されています)。

これが私が試したことです:

1)別のWeb.configをMySubFolder:に追加しました

   <configuration>
     <system.web>
       <authorization>
         <allow users="*"/>
       </authorization>
     </system.web>
   </configuration>

2)次のような<location>タグをルートレベルのWeb.configに追加しました。MySubFolder

   <location path="MySubFolder">
     <system.web>
       <authorization>
         <allow users="*"/>
       </authorization>
     </system.web>
   </location>

3) IISで機能の委任を更新することを検討しました。

個人的には、上記の解決策に疑問を持っていました。私が読んだことから、これらの解決策は、フォーム認証を有効にしたまま、すべてのアクセスを許可することを目的としているためです。サブフォルダでフォーム認証を実際に無効にする方法が必要です。これは可能ですか?

また、私のサブフォルダーは仮想ディレクトリである可能性がありますが、いずれかの方法で必須ではないことにも注意してください。そのフォルダでFormsAuthを無効にする方法が必要です。

リクエストに応じて、私のWeb.configファイル(サイトレベル):

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="MyConnString" connectionString="Persist Security Info=True;Initial Catalog=MyDB;Data Source=MyServer;User ID=UserName;Password=xxxxxxxxxx;MultipleActiveResultSets=True;"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>
  </system.web>
  <system.webServer>
    <modules runManagedModulesForWebDavRequests="true" runAllManagedModulesForAllRequests="true">
      <add name="CustomWebDAVModule" type="CustomWebDAVModule"/>
    </modules>
  </system.webServer>
</configuration>
4

3 に答える 3

5

この質問はすでに回答済みです:web.configの複数/異なる認証設定

ロケーションタグ内のルート認証mode="Forms"タグを上書きすることはできません。フォルダを独自のアプリケーションにするのが最も簡単な方法です。

もう1つのオプションは、独自のカスタムフォーム認証を実装し、webdavフォルダーのリダイレクトを無視するようにすることです。

<authentication mode="None">
于 2013-01-03T19:56:32.230 に答える
1

どうやら、IIS内でWebDAVを正しく設定していないようです。

認証にカスタムwebdavモジュールを使用するため、最初にIISがWebDAV要求に干渉しないことを確認する必要があります。

次の手順に従います(重要なポイントは手順7にあることに注意してください)。

  1. web.config(質問に投稿されているように)そのままにしてください。

  2. IIS内でWebDavを有効にします。IISマネージャー内で、Webサイトを選択します。メインウィンドウ内で開きWebDAV Authoring Rulesます。

    WebDAVオーサリングルールを開く

  3. アクションペイン(右側)で、をクリックしますEnable WebDAV

    WebDavを有効にする

  4. 次に、WebDAVを有効にするサブフォルダー(このpath3例では使用しています)をクリックして選択し、を開きWebDAV Authoring Rulesます。

    サブフォルダーのWebDAVオーサリングルールを開きます

  5. Add authoring rule...アクションペイン(右側)をクリックします。

    -[オーサリングルールの追加...]をクリックします

  6. 開いたダイアログで、これらすべてが選択されていることを確認し、、、、をクリックしてAll content、をクリックします。これにより、すべての権限を持つすべてのユーザーに、そのサブフォルダーのすべてのコンテンツへのアクセスが許可されます。All usersReadSourceWriteOK

    オーサリングルールを追加

  7. 今最も重要な部分。カスタムWebDAVハンドラーを介してWebDAV認証を処理する必要があるため、認証に干渉しないようにIISに明示的に指示する必要があります。どうすればいいですか?IISに匿名のWebDAVアクセスを許可するように指示します。このように、IISはユーザーの認証を試みず、モジュールは自由に認証操作を実行できます。これを行うには、以下に設定Allow Anonymous Property Queriesする必要があります。次のステップでは、これを行う方法を強調します。TrueWebDav settings

  8. サイトルートを開きWebDAV Authoring Rulesます。

    WebDAVオーサリングルールを開く

  9. をクリックしWebDAV settings...ます。

    -WebDAV設定をクリックします...-

  10. に設定Allow Anonymous Property QueriesTrueます。

    匿名プロパティクエリを許可するを設定する

  11. テストするWebDAVクライアントを閉じて再起動します。これは、以前の誤った構成からの接続パラメーターをキャッシュしないようにするためです。

  12. WebサイトのWebDAV構成が希望どおりに機能するかどうかを確認します。:)

于 2012-12-28T15:16:22.783 に答える
1

カスタムHTTPモジュール内で、次の方法でリダイレクトを抑制するようにフォーム認証に指示できますHttpResponse.SuppressFormsAuthenticationRedirect

public class DavAuthenticationModule : IHttpModule
{
        public void Init(HttpApplication application)
        {
            application.AuthenticateRequest += App_OnAuthenticateRequest;
        }

        private void App_OnAuthenticateRequest(object source, EventArgs eventArgs)
        {
            // Only applies for WebDAV requests.
            var ctx = HttpContext.Current;
            if (!ctx.Request.Path.StartsWith("/dav/path", StringComparison.OrdinalIgnoreCase))
                return;

            // So that forms auth won't do a redirect.
            // Note that it will still attempt to read / parse the forms auth cookie.
            ctx.Response.SuppressFormsAuthenticationRedirect = true;        

            // Now do my own auth.
            DoBasicHttpAuthentication(ctx);
        }
}

もう1つのオプションは、FormsAuthenticationModule.AuthenticateFormsAuthが実行される前にイベントをフックして認証することです。これには、IISでモジュールインスタンスを探し回る必要がありますが、例はありません。

これらのオプションは両方とも、.NET 4.6リファレンスソースに基づいています:http://referencesource.microsoft.com/#System.Web/Security/FormsAuthenticationModule.cs,ac471f8ac73cdb2b

于 2015-10-26T04:09:41.687 に答える