簡體   English   中英

如何處理PrincipalPermission安全異常

[英]How to handle PrincipalPermission Security exceptions

我有一個簡單的方法是安全的

[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.transfer到的403 URL。 如果瀏覽到安全的/ location,則正確顯示403錯誤頁面。

我完全不知道問題出在哪里。 但是我正在使用類似的東西,對我來說,這種解決方案(最小化)效果很好。

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 and catch securityexception來顯示用戶,不允許他執行此類操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM