如何处理PrincipalPermission安全性异常

时间:2011-02-28 22:27:08

标签: c# asp.net error-handling securityexception custom-errors

我有一个安全的简单方法

[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);
}

这一切都运行良好,并重定向到我的错误页面,该页面正常工作,但不是按预期显示内容。我立即得到了错误页面的第二个请求,但这次使用的是customErrorsSection.DefaultRedirect的值,它不是以我能看到的任何方式来自我的代码。

据我所知,这几乎就像.NET为PrincipalPermission引发异常然后让整个请求完成,然后在请求完成后抛出应用程序响应,而是以默认的自定义错误响应。

当我正在调试时,我确实打破了PrincipalPermission的两个独立异常,这是否只是.NET的一次重新抛出我不确定但是我的.NET代码永远不会看到第二次抛出,也不是ELMAH。我总是最终得到一个单一的响应,记录单个错误,但最终呈现给浏览器的url是默认的url而不是我特意server.transferred的403 url。如果我浏览到一个安全的位置,我会正确获取403错误页面。

1 个答案:

答案 0 :(得分: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

但是在某些地方我没有重定向,只是使用try并捕获securityexception来显示用户,不允许他执行此类操作。