9

ASP.NET でロール ベースの承認を正常に実装しました。人が必要な役割を持っていない場合、401.2 が許可されていないというエラー ページが表示されます。

私が今達成したいことは、アプリケーションにカスタム 401 ページを作成し、web.config の設定を介してそこにリダイレクトすることです。私はこれを試しました:

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
    <error statusCode="401" redirect="NoAccess.htm" />
</customErrors>

しかし、これは引っかかりません。代わりに IIS でオーバーライドする必要がありますか? それが物事の展開を難しくするのではないことを願っています。

4

4 に答える 4

8

最近同じ問題に遭遇しましたが、これは Windows 認証を使用する際の癖の 1 つであることが判明しました。

Joshua Flanaganは、web.config の customErrors セクションを尊重し、401 エラー ページにリダイレクトする素敵な HttpModuleを作成しました。

解決策の鍵は、ページ ライフサイクルのEndRequestイベントをインターセプトし、401 ステータス コードを確認してから、カスタム ページを実行することです。

HttpModule の移植性は、ソリューションを再利用可能にし、Global.asax をクリーンに保つため、優れていますが、必要に応じて、Global.asax の EndRequest イベントを彼のコードに接続することを妨げるものは何もありません。

ASP.NET MVC を使用している場合、ソリューションはそれほど洗練されていません。

于 2010-02-06T01:23:57.597 に答える
4

HttpModule を追加したくない場合

web.config で

<system.web>
    <customErrors mode="On" defaultRedirect="~/MyController/MyErrorAction/" redirectMode="ResponseRedirect">
      <error statusCode="401" redirect="~/MyController/MyErrorAction/" />
    </customErrors>

global.asax.cs で

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;

        if (application.Response.StatusCode != 401 || !application.Request.IsAuthenticated) return;

        application.Response.ClearContent();

        //You can replace the piece below is to redirect using MVC, or your can replace all this with application.Server.Execute(yourPage);
        IController errorController = new SharedController();
        var rd = new RouteData();
        rd.Values.Add("controller", "MyController");
        rd.Values.Add("action", "MyErrorAction");
        rd.Values.Add("value", "You or your user group do not have permissions to use the address: " + Request.Url.PathAndQuery);

        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
        HttpContext.Current.Server.ClearError();
    }
于 2012-09-17T18:37:26.557 に答える
4

MVC にとらわれないバリアントを次に示します。

Web.config 内

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
    <error statusCode="401" redirect="NoAccess.htm" />
</customErrors>

Global.asax.cs 内

protected void Application_EndRequest(object sender, EventArgs e)
{
    HttpApplication application = (HttpApplication)sender;

    if (application.Response.StatusCode != 401 || !application.Request.IsAuthenticated) return;

    var customErrors = (CustomErrorsSection)ConfigurationManager.GetSection("system.web/customErrors");

    var accessDeniedPath = customErrors.Errors["401"] != null ? customErrors.Errors["401"].Redirect : customErrors.DefaultRedirect;
    if (string.IsNullOrEmpty(accessDeniedPath))
        return; // Let other code handle it (probably IIS).

    application.Response.ClearContent();
    application.Server.Execute(accessDeniedPath);
    HttpContext.Current.Server.ClearError();
}
于 2013-08-29T21:11:06.620 に答える