Autorización basada en roles en ASP.NET Core
Cuando se crea una identidad, puede pertenecer a uno o varios roles. Por ejemplo, Puede pertenecer a los roles Administrador y Usuario, mientras que Scott solo puede pertenecer al rol Usuario. La forma en que se crean y administran estos roles depende del almacén de respaldo del proceso de autorización. Los roles se exponen al desarrollador mediante el método IsInRole en la clase ClaimsPrincipal.
Agregar comprobaciones de roles
Las comprobaciones de autorización basadas en roles son declarativas: el desarrollador las inserta dentro de su código, en un controlador o en una acción dentro de un controlador, especificando roles de los que el usuario actual debe ser miembro para acceder al recurso — solicitado.
Por ejemplo, el código siguiente limita el acceso a las acciones de a los usuarios AdministrationController que son miembros del Administrator rol:
[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}
Puede especificar varios roles como una lista separada por comas:
[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}
Este controlador solo sería accesible para los usuarios que son miembros del HRManager rol o del Finance rol.
Si aplica varios atributos, un usuario que accede debe ser miembro de todos los roles especificados; El ejemplo siguiente requiere que un usuario sea miembro del rol PowerUser ControlPanelUser y .
[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}
Puede limitar aún más el acceso aplicando atributos de autorización de rol adicionales en el nivel de acción:
[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
}
En el fragmento de código anterior, los miembros del rol o del rol pueden acceder al controlador y a la acción, pero solo los miembros del rol pueden Administrator PowerUser acceder a la SetTime Administrator ShutDown acción.
También puede bloquear un controlador, pero permitir el acceso anónimo y no autenticado a acciones individuales.
[Authorize]
public class ControlPanelController : Controller
{
public ActionResult SetTime()
{
}
[AllowAnonymous]
public ActionResult Login()
{
}
}
Para Razor Pages, AuthorizeAttribute el se puede aplicar mediante:
- Usar una convención, o
- Aplicación de a
AuthorizeAttributelaPageModelinstancia de :
[Authorize(Policy = "RequireAdministratorRole")]
public class UpdateModel : PageModel
{
public ActionResult OnPost()
{
}
}
Importante
Los atributos de filtro, incluido AuthorizeAttribute , solo se pueden aplicar a PageModel y no se pueden aplicar a métodos de controlador de página específicos.
Comprobaciones de roles basadas en directivas
Los requisitos de rol también se pueden expresar mediante la nueva sintaxis de directiva, donde un desarrollador registra una directiva en el inicio como parte de la configuración del servicio de autorización. Esto suele ocurrir en en ConfigureServices() el archivo Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole",
policy => policy.RequireRole("Administrator"));
});
}
Las directivas se aplican mediante Policy la propiedad en el atributo AuthorizeAttribute :
[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
return View();
}
Si desea especificar varios roles permitidos en un requisito, puede especificarlos como parámetros para el RequireRole método :
options.AddPolicy("ElevatedRights", policy =>
policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));
En este ejemplo se autoriza a los usuarios que pertenecen a los Administrator PowerUser roles o BackupAdministrator .
Agregar servicios de rol a Identity
Anexe AddRoles para agregar servicios de rol:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
services.AddRazorPages();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddRoles<IdentityRole>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}