IIS 7.5で実行されているphpのWebサイトがあります。このサイトはWindows認証によって保護されており、正常に機能します。
ユーザーがサイトにアクセスすると、ユーザー名とパスワードが要求され、認証された場合は通過します。ユーザーが[キャンセル]をクリックするか、パスワードを3回間違えると、401エラーページが表示されます。
次に、ログイン方法を説明するカスタムページを表示します。エラーページに移動し、ステータスコード401.2を選択して、表示するページをポイントします。
次に、すべてのユーザーに対してカスタムエラーがオンになっていることを確認します。そして、カーブーム!認証が機能しなくなり、ユーザーにパスワードプロンプトが表示されなくなります。ドキュメントに記載されているように、Windows認証は最初に401応答を送信することで機能し、次にブラウザがユーザーにプロバイダーの資格情報を要求し、次に次に何をするかを決定します。
ここで何が起こるか:ページの最初のリクエスト時にIISは401ヘッダーを送信しようとしますが、web.configが「401でこのページにリダイレクトします」と言っていることに気づきました。認証の代わりに、リダイレクトページを与えます。
私は401、401.1、401.2を交換しようとしました-違いはありませんでした。
何が問題なのか、またユーザー認証エラー時にカスタムページを表示する方法は?
pSここにweb.configがあります:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="500" subStatusCode="-1" />
<remove statusCode="404" subStatusCode="-1" />
<remove statusCode="401" subStatusCode="-1" />
<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />
<error statusCode="404" prefixLanguageFilePath="" path="/not_restricted/404.htm" responseMode="ExecuteURL" />
</httpErrors>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
<system.web>
<identity impersonate="false" />
<customErrors defaultRedirect="http://www.myserver.com/not_restricted/500.htm" mode="Off">
</customErrors>
</system.web>
</configuration>
これを試して:
変化する:
<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="/not_restricted/401.htm" responseMode="ExecuteURL" />
に
<error statusCode="401" subStatusCode="2" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />
応答モード 'File' IISは、そのファイルのコンテンツをロードして表示するだけで、401ステータスをクライアントに送り返します。
以前は「ExecuteURL」を使用していましたが、ファイルモードの方がはるかに優れていることがわかりました。エラーページのリンクされたリソースが引き続き機能することを確認する必要があります。
カスタムhttperrorsを追加した後、ユーザーに資格情報が要求されないという同じ問題に遭遇し、subStatusCodeを0にして修正することができました。これが誰かに役立つことを願っています。
<error statusCode="401" subStatusCode="0" path="..." responseMode="ExecuteURL">
そのため、ブラウザでプロンプトが表示されない基本認証のまったく同じ問題で苦労していました。 401.0のカスタムエラーを強制する(つまり、サブコードを明示的に0に設定する)ことも、レジストリキーの作成を設定することも、それを解決しませんでした。
はじめに、カスタムエラーページの使用であることがわかりました。それらをオフにすると、すべてが正常に機能し、再びオンになりました。具体的には、401(0)および401.2エラーによってプロンプトが妨げられました。
カスタムエラータイプを「ExecuteURL」から「File」に設定すると解決しましたが、ユーザーがプロンプトをキャンセルしたり、不正なパスワードを入力したりすると、一般的な「このディレクトリまたはページを表示する権限がありません」が表示されます。
さまざまな投稿から多くのヒントを得た後、正確な「ハウツー」または「なぜ」ではない...私は、サイトのサブディレクトリにあるカスタムエラーファイルの相対パスを使用していました。パスを絶対パスに変更すると、キャンセルした場合やパスワードが間違っている場合に、上記の一般的なエラーが「このページを表示できません」に置き換えられました。もう少し掘り下げてみると、 post がデフォルトでfalseに設定されている構成属性 "allowAbsolutePathsWhenDelegated"について話していることがわかりました。また、カスタマーエラーファイルをサイトのルートに配置し、次にカスタムエラーの場所にファイル名(つまり、サイトのルートへの相対パス)を配置しただけでも機能することを示しています。 、サイトのルートにカスタムエラーを配置したくありませんでした。したがって、ConfigurationEditorを使用して上記の属性をtrueに設定し、絶対パスをカスタムエラーファイルに設定すると、すべてが正常に機能し始めました。プロンプトが残り、トリガーされたときにカスタムエラーが表示されます。
入れ子になった相対パスでFile属性を使用できるようにしたいのですが、これまでのところ、これができない理由やその方法がわかりません。もう1つの質問は、絶対パスを使用する場合、セキュリティホールを作成する可能性があるかどうかです(つまり、なぜこれがデフォルトで無効になるのですか?)
とにかく、これが誰かを助けることを願っています。
私の場合、奇妙な理由で、asp.net MVC 5で最大2つのソリューションを組み合わせるとうまくいきました。
<error statusCode="401" subStatusCode="0" prefixLanguageFilePath="" path="not_restricted\401.htm" responseMode="File" />