У меня есть простой метод, который защищен
[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.