我有一个安全的简单方法
[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 错误页面。