Как обрабатывать исключения безопасности PrincipalPermission - PullRequest
0 голосов
/ 01 марта 2011

У меня есть простой метод, который защищен

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

Если щелкнуть по нему без роли, он генерирует System.Security.SecurityException: Request for principal permission failed., как и ожидалось.

Я использую ELMAH для обработки журналов длямои ошибки, и у меня есть пользовательское событие ELMAH в моем global.asax для передачи на страницы ошибок способами, которые сохраняют коды состояния, которые работают правильно.

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 и затем завершает весь запрос, то после завершения запроса он отбрасывает ответ приложения и вместо этого отвечает пользовательской ошибкой по умолчанию.

При отладке яразбить на 2 отдельных исключения для PrincipalPermission, является ли это просто переброской .NET, я не уверен, но мой код .NET никогда не видит 2-й бросок, как и ELMAH.Я всегда получаю один ответ, записываю одну ошибку, но URL-адрес, который в конечном итоге отображается в браузере, является URL-адресом по умолчанию, а не 403-адресом, на который я специально перевел сервер.Если я перехожу к безопасному расположению /, я правильно получаю страницу с ошибкой 403.

1 Ответ

1 голос
/ 01 марта 2011

Я не знаю точно, где проблема. Но я использую нечто подобное, и для меня это решение (минимизированное) прекрасно работает.

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

Но в некоторых местах я не перенаправляю, а просто пытаюсь поймать исключение security для отображения пользователю, что ему не разрешено выполнять такие действия.

...