PrincipalPermissionAttribute is verouderd als fout
De PrincipalPermissionAttribute constructor is verouderd en produceert een compilatietijdfout. U kunt dit kenmerk niet instantiëren of toepassen op een methode.
Wijzigingsbeschrijving
In .NET Framework en .NET Core kunt u aantekeningen toevoegen aan methoden met het PrincipalPermissionAttribute kenmerk. Voorbeeld:
[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]
public void MyMethod()
{
// Code that should only run when the current user is an administrator.
}
Vanaf .NET 5 kunt u het PrincipalPermissionAttribute kenmerk niet toepassen op een methode. De constructor voor het kenmerk is verouderd en produceert een compilatietijdfout. In tegenstelling tot andere verdoezelingswaarschuwingen, kunt u de fout niet onderdrukken.
Reden voor wijziging
Het PrincipalPermissionAttribute type, zoals andere typen die subklassen SecurityAttributehebben, maakt deel uit van . DE CAS-infrastructuur (Code Access Security) van NET. In .NET Framework 2.x - 4.x dwingt PrincipalPermissionAttribute de runtime aantekeningen af bij het invoeren van methoden, zelfs als de toepassing wordt uitgevoerd onder een scenario met volledige vertrouwensrelatie. .NET Core en .NET 5 en hoger bieden geen ondersteuning voor CAS-kenmerken en de runtime negeert deze.
Dit verschil in gedrag van .NET Framework tot .NET Core en .NET 5 kan resulteren in een 'fail open'-scenario, waarbij de toegang moet zijn geblokkeerd, maar in plaats daarvan is toegestaan. Om te voorkomen dat het scenario 'fail open' wordt uitgevoerd, kunt u het kenmerk niet meer toepassen in code die is gericht op .NET 5 of hoger.
Versie geïntroduceerd
5,0
Aanbevolen actie
Als u de verdoezelingsfout tegenkomt, moet u actie ondernemen.
Als u het kenmerk toepast op een ASP.NET MVC-actiemethode:
Overweeg ASP te gebruiken. De ingebouwde autorisatie-infrastructuur van NET. De volgende code laat zien hoe u aantekeningen maakt op een controller met een AuthorizeAttribute kenmerk. De ASP.NET runtime autoriseert de gebruiker voordat de actie wordt uitgevoerd.
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. } } }
Zie Autorisatie op basis van rollen in ASP.NET Core en Inleiding tot autorisatie in ASP.NET Core voor meer informatie.
Als u het kenmerk toepast op bibliotheekcode buiten de context van een web-app:
Voer de controles handmatig uit aan het begin van de methode. Dit kan worden gedaan met behulp van de IPrincipal.IsInRole(String) methode.
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. }