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 属性をメソッドに適用できません。 この属性のコンストラクターは非推奨であり、コンパイル時のエラーを発生させます。 他の非推奨警告とは異なり、エラーを非表示にすることはできません。

変更理由

SecurityAttribute をサブクラス化する他の型と同様に、PrincipalPermissionAttribute 型は .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