14

ASP.NET MVC 2 プロジェクトに取り組んでいます。ユーザーが何らかのアクションを表示する権限を持っていない場合に発生する不正アクセスの例外をキャッチするための例外フィルターを作成します。

[CustomError(typeof(UnauthorizedAccessException), "Error", "UnauthorizedAccess")]
public class MyController : BaseController
{
}

例外がスローされた後、フィルターは次のメソッドである構成済みのコントローラー/アクションに転送されます。

public ActionResult UnauthorizedAccess(ExceptionContext context)
{
    Response.StatusCode = CustomHttpStatusCode.UnauthorizedUser;

    return View(model);
}

最後に、ASP.NET アプリケーションがこの要求を終了する前に、Global.ascx にある次のメソッドを呼び出して、カスタム HTTP ステータス コードを HTTP ステータス 401 (不正アクセス) に変更します。

public void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.StatusCode == CustomHttpStatusCode.UnauthorizedUser)
    {
        Response.StatusCode = 401;
    }
}

私のマシン(IIS 7.5)ではすべて正常に動作しています。しかし、デプロイ Web サイトでは機能しません。それでも、「このディレクトリまたはページを表示する権限がありません」というプレーン テキストが返されます。カスタム エラー ページの代わりに。

PS。次の構成は、この場合の現在の web.config です。

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration>
    <system.web>
      <customErrors mode="On"></customErrors>
    </system.web>
    <system.webServer>
      <httpErrors errorMode="Custom">
         <remove statusCode="502" subStatusCode="-1" />
         <remove statusCode="501" subStatusCode="-1" />
         <remove statusCode="500" subStatusCode="-1" />
         <remove statusCode="412" subStatusCode="-1" />
         <remove statusCode="406" subStatusCode="-1" />
         <remove statusCode="405" subStatusCode="-1" />
         <remove statusCode="404" subStatusCode="-1" />
         <remove statusCode="403" subStatusCode="-1" />
         <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>
4

2 に答える 2

15

IIS7 の既定のエラー メッセージは、2 つの方法で通過できます。

1 つは、response.TrySkipIisCustomErrors を true に設定することです。

response.TrySkipIisCustomErrors = true;
response.Status = response.Status;

response.Status を設定しないと、何らかの理由で TrySkipIisCustomErrors が受け入れられません。

もう 1 つは、web.config で existingResponse を「PassThrough」に設定することです。

<configuration>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
</configuration>

ただし、これにより、設定されているすべての IIS カスタム エラー ページが無視されます。

于 2013-06-26T15:23:38.627 に答える
14

この問題の簡単な解決策を見つけました。次のコードのように、新しい設定を web.config ファイルに追加するだけです。私の展開 Web サイトではすべて正常に動作します。

  <?xml version="1.0" encoding="utf-8"?>
  <configuration> 
    <system.webServer>
      <httpErrors errorMode="Custom" existingResponse="PassThrough">
          <remove statusCode="502" subStatusCode="-1" />
          <remove statusCode="501" subStatusCode="-1" />
          <remove statusCode="500" subStatusCode="-1" />
          <remove statusCode="412" subStatusCode="-1" />
          <remove statusCode="406" subStatusCode="-1" />
          <remove statusCode="405" subStatusCode="-1" />
          <remove statusCode="404" subStatusCode="-1" />
          <remove statusCode="403" subStatusCode="-1" />
          <remove statusCode="401" subStatusCode="-1" />
      </httpErrors>
    </system.webServer>
  </configuration>

したがって、プレーン テキストと JSON 応答の両方でカスタム エラー ページを作成することもできます。

詳細: HttpErrorsSection クラス

PS。しかし、IIS マネージャーのエラー ページ機能にexistingResponse属性が見つかりません。

于 2010-12-05T12:13:53.030 に答える