0

安全な簡単な方法があります

[PrincipalPermission(SecurityAction.Demand, Role = "Administrator")] 
protected void lnkClearCache_Click(object sender, EventArgs e)
{
    ...
}

ロールなしでこれをクリックするとSystem.Security.SecurityException: Request for principal permission failed.、期待どおりに生成されます。

ELMAHを使用してエラーのログを処理し、global.asaxにカスタムELMAHイベントを設定して、正しく機能するステータスコードを保持する方法でエラーページに転送します。

private void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
    var customErrorsSection = GetCustomErrorsSection();       
    var error = args.Entry;

    string statusCode = error.Error.StatusCode.ToString();

    if (statusCode == "0" && error is security exception)
        statusCode = "403";

    var errorSection = customErrorsSection.Errors[statusCode];
    string redirectUrl = errorSection == null ?
            customErrorsSection.DefaultRedirect : errorSection.Redirect;


    RespondWithServerError(error.Id, redirectUrl, statusCode);
}

これはすべてうまく機能し、正しく機能するエラーページにリダイレクトされますが、コンテンツを期待どおりに表示するのではありません。エラーページの2番目のリクエストをすぐに受け取りますが、今回は、コードから取得できないcustomErrorsSection.DefaultRedirectの値を使用しています。

私が知る限り、.NETがPrincipalPermissionの例外を発生させてから、リクエスト全体を完了させた場合とほぼ同じです。リクエストが完了すると、アプリケーションの応答が破棄され、代わりにデフォルトのカスタムエラーで応答します。

デバッグしているとき、PrincipalPermissionの2つの別々の例外でブレークします。これが、.NETによる単なる再スローであるかどうかはわかりませんが、.NETコードで2番目のスローが表示されることはなく、ELMAHも表示されません。私は常に単一の応答、単一のエラーがログに記録されることになりますが、最終的にブラウザーにレンダリングされるURLはデフォルトのURLであり、特にserver.transfered先の403URLではありません。安全な/locationを参照すると、403エラーページが正しく表示されます。

4

1 に答える 1

1

問題がどこにあるのか正確にはわかりません。しかし、私は似たようなものを使用しており、私にとってこのソリューション(最小化)はうまく機能します。

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim er = HttpContext.Current.Error
        If er.GetType.Equals(GetType(System.Security.SecurityException)) Then
            HttpContext.Current.Response.Redirect(FormsAuthentication.LoginUrl & "?ReturnUrl=" & HttpContext.Current.Request.Path)
        End If
    End Sub

それはglobal.asaxからです

しかし、一部の場所では、リダイレクトせず、セキュリティ例外をキャッチしてユーザーを表示するだけで、ユーザーはそのようなアクションを実行できません。

于 2011-02-28T22:39:23.243 に答える