Me gustaría agregar autorización a un controlador, para múltiples roles a la vez.
Normalmente, se vería así:
[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}
Pero he almacenado mis roles en consts, ya que pueden cambiar o extenderse en algún momento.
public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";
No puedo hacer esto, ya que la cadena debe conocerse en el momento de la compilación:
[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}
¿Existe alguna forma de evitar el problema?
PODRÍA escribir una constante que simplemente contenga "RoleA, RoleB, RoleC", pero no me gustan las cadenas mágicas y esta es una cadena mágica. Cambiar el nombre de un rol y olvidarse de cambiar la cadena combinada sería un desastre.
Estoy usando MVC5. La identidad ASP.NET y el rol se conocen en tiempo de compilación.
c#
asp.net-mvc
authorization
Christian Sauer
fuente
fuente
Respuestas:
Intente crear un atributo de autorización personalizado como este .
Suponiendo que sus roles serán los mismos para varios controladores, cree una clase auxiliar:
Entonces úsalo así:
fuente
Asegúrese de derivar su clase de atributo personalizado desactivado
System.Web.Mvc.AuthorizeAttribute
y NOSystem.Web.Http.AuthorizeAttribute
.Tuve el mismo problema. Una vez que lo cambié, todo funcionó.
También puede agregar lo siguiente a su clase de atributo personalizado:
fuente
System.Web.Http.AuthorizeAttribute
EN LUGAR DESystem.Web.Mvc.AuthorizeAttribute
La mejor y más sencilla forma que encontré para resolver este problema es simplemente concatenar roles en el atributo Authorize.
con CustomRole una clase con cadenas constantes como esta:
fuente
Lo que hice es la respuesta en @Tieson
Modifico un poco su respuesta. En lugar de cadena. ¿Por qué no convertirlo en una lista?
Esta es mi respuesta:
Y luego verifique si el rol es válido anulando OnAuthorization
Y ahí lo tienes, ahora está validando si el rol está autorizado para acceder al recurso
fuente
Siento que un atributo de autorización personalizado es excesivo para este problema, a menos que tenga una gran cantidad de roles.
Dado que la cadena debe conocerse en el momento de la compilación, ¿por qué no crear una clase de rol estático que contenga cadenas públicas de los roles que ha definido y luego agregar cadenas separadas por comas con ciertos roles que desea autorizar?
Y luego puede usar el atributo de autorización como tal en la clase de controlador o el método de controlador (o ambos):
fuente
ADMIN_OR_VIEWER
rol en la acción es redundante porque no se le permitirá acceder alCreate
método si aún no tiene elADMIN
rol. En este casoVIEWER
, nunca podrá invocar elCreate
método.