Share via


PrincipalPermissionAttribute 已淘汰為錯誤

PrincipalPermissionAttribute 建構函式已淘汰,而且會產生編譯時期錯誤。 您無法具現化此屬性,或將其套用至方法。

變更描述

在 .NET Framework 和 .NET Core 上,您可以使用 PrincipalPermissionAttribute 屬性標註方法。 例如:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
public void MyMethod()
{
    // Code that should only run when the current user is an administrator.
}

從 .NET 5 開始,您便無法將 PrincipalPermissionAttribute 屬性套用到方法。 屬性的建構函式已淘汰,而且會產生編譯時期錯誤。 這與其他淘汰的警告不同,您無法隱藏錯誤。

變更原因

PrincipalPermissionAttribute 類型和以 SecurityAttribute 為子類別的其他類型一樣,是屬於 .NET 的程式碼存取安全性 (CAS) 基礎結構的一部分。 在 .NET Framework 2.x - 4.x 中,執行階段會在方法輸入上強制執行 PrincipalPermissionAttribute 註釋,即便應用程式是在完全信任的情況下執行也是如此。 .NET Core 和 .NET 5 及更新版本不支援 CAS 屬性,而且執行階段會忽略這些屬性。

從 .NET Framework 到 .NET Core 和 .NET 5 的行為差異可能會導致產生「失敗開啟」案例,使存取在應該受到禁止的情況下受到允許。 為了防止「失敗開啟」案例,您無法再於以 .NET 5 或更新版本為目標的程式碼中套用該屬性。

導入的版本

5.0

如果您遇到混淆錯誤,則必須採取動作。

  • 如果您要將屬性套用至 ASP.NET MVC 動作方法:

    請考慮使用 ASP.NET 的內建授權基礎結構。 下列程式碼示範如何使用 AuthorizeAttribute 屬性標註控制器。 ASP.NET 執行階段會在執行動作之前授權使用者。

    using Microsoft.AspNetCore.Authorization;
    
    namespace MySampleApp
    {
        [Authorize(Roles = "Administrator")]
        public class AdministrationController : Controller
        {
            public ActionResult MyAction()
            {
                // This code won't run unless the current user
                // is in the 'Administrator' role.
            }
        }
    }
    

    如需詳細資訊,請參閱 ASP.NET Core 中的角色型授權ASP.NET Core 中的授權簡介

  • 如果您要將屬性套用至 Web 應用程式內容以外的程式庫程式碼:

    以手動方式在方法開頭執行檢查。 這可以使用 IPrincipal.IsInRole(String) 方法來完成。

    using System.Threading;
    
    void DoSomething()
    {
        if (Thread.CurrentPrincipal == null
            || !Thread.CurrentPrincipal.IsInRole("Administrators"))
        {
            throw new Exception("User is anonymous or isn't an admin.");
        }
    
        // Code that should run only when user is an administrator.
    }
    

受影響的 API