次の方法で共有


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