安全な簡単な方法があります
[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エラーページが正しく表示されます。