【问题标题】:How to handle PrincipalPermission Security exceptions如何处理 PrincipalPermission 安全异常
【发布时间】:2011-02-28 22:27:08
【问题描述】:

我有一个安全的简单方法

[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 的 2 个单独异常,这是否只是 .NET 的重新抛出我不确定,但我的 .NET 代码从未看到第二次抛出,ELMAH 也没有。我总是以一个响应结束,记录一个错误,但最终呈现给浏览器的 url 是默认 url,而不是我专门 server.transferred 到的 403 url。如果我浏览到安全的 / 位置,我会正确获得 403 错误页面。

【问题讨论】:

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


    【解决方案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

    但在某些地方我不重定向,只是使用尝试捕获安全异常来显示用户,不允许他执行此类操作。

    【讨论】:

    • 嗯,这完全是愚蠢的,ASP.NET 以某种方式神奇地使错误出现在应用程序错误中,这完全绕过了所有正常的错误处理。因此,复制和粘贴我的 ErrorLog_Logged 方法的一半给了我预期的结果,因为我的另一块灵魂因为不得不做这样的事情而死。
    猜你喜欢
    • 1970-01-01
    • 2018-03-06
    • 2017-01-16
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2016-11-03
    • 2015-03-25
    • 2021-08-19
    相关资源
    最近更新 更多