c# - 画面 - aspxerrorpath 表示しない



ログオンページにリダイレクトするのではなく、Authorize属性のカスタム403エラーページを返す方法 (2)

AuthorizeAttributeから派生した独自のクラスを作成し、 AuthorizeCoreメソッドをオーバーライドして必要な承認メカニズムを提供できるようにする必要があります。コントローラに移動する代わりに属性を使用してカスタム認証コードを適用できます。

権限をより細かく制御する必要がある場合は、 IActionFilterインターフェイスの実装を作成することをお勧めします(属性の場合は、メソッドに属性を適用してください)。 これにより、コントローラに行く前にコールを傍受し、コントローラメソッドが呼び出される前に代替アクションを提供することができます。

これは、 IActionFilterインターフェイスでOnActionExecutingメソッドを実装することによって実現されます。 あなたのロジックが、コントローラへの呼び出しをまったく行うべきではないと判断し、代わりにActionResultを提供したい場合は、メソッドに渡されたActionExecutingContextインスタンスのResultプロパティを設定します。 これを行うことで、 ActionResultを取得するためにControllerメソッドに行く代わりに、そのActionResultが処理されます。

403エラーコードを返す場合は、 ContentResultクラスを使用することはできません。 ActionResultから派生し、 ExecuteResultメソッドをオーバーライドしてHttpResponseBase StatusCodeプロパティを403に設定する独自のクラスを作成する必要があります。

internal class Http403Result : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        // Set the response code to 403.
        context.HttpContext.Response.StatusCode = 403;
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Result = new Http403Result();
    }
}

もちろん、 Http403Resultクラスを一般化して、 Http403Resultステータスコードを受け入れるコンストラクタを取得することもできますが、コンセプトは同じです。

https://src-bin.com

[Authorize]属性は素敵で便利なMSの発明であり、私が今問題を解決できることを願っています

もう少し詳しく言うと:

現在のクライアントが認証されていない場合 - [Authorize]はセキュリティで保護されたアクションからログオンページにリダイレクトし、ログオンが成功した後、ユーザーを元に戻します。

しかし、現在のクライアントがすでに認証されていても、特定のアクションを実行する権限がない場合は、一般的な403ページを表示するだけです。

コントローラーの本体内で許可ロジックを動かさなくても可能ですか?

更新 :私が必要とする動作は、このスケッチと意味的に等しくなければなりません:

public ActionResult DoWork()
{
    if (!NotAuthorized())
    {
        // this should be not redirect, but forwarding 
        return RedirectToAction("403");         
    }

    return View();
}

したがって、リダイレクトとURLは同じにとどまるべきではありませんが、ページの内容は403ページに置き換えてください

更新2 :私はこのようにスケッチを実装しました:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    [CustomActionFilter]
    public ActionResult About()
    {
        return View();
    }

    public ActionResult Error_403()
    {
        return Content("403");
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Result = new ContentResult { Content = "403" };
    }
}

また、HomeController.Action_403()に実行を正しく転送する方法を取得できないため、403が表示されます。

アップデート3

filterContext.Result = new ViewResult() { ViewName = "Error_403" };

これは特定のビューテンプレートをレンダリングする方法に関する回答ですが、他のコントローラをどのように実行するかはまだ分かりません。とにかく、十分な解決策です。


Answer #1

私がやることは、AuthorizeAttributeをサブクラス化して、HandleUnauthorizedRequestをオーバーライドして、ユーザー認証されるとHTTPステータスコード403を返すことです。 次に、Web.Configにsystem.webServer \ httpErrorsセクションを追加して、デフォルトの403をカスタムページに置き換えます(この最後の部分にはIIS 7+が必要です)。 方法は次のとおりです。

public class MyAuthorizeAttribute : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            filterContext.Result = new HttpStatusCodeResult(403);
        else
            filterContext.Result = new HttpUnauthorizedResult();
    } 
}

<configuration>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" />
      <error statusCode="403" responseMode="ExecuteURL" path="/Error/MyCustom403page" />
    </httpErrors>
  </system.webServer>
</configuration>




authorization