Je voudrais ajouter une autorisation à un contrôleur, pour plusieurs rôles à la fois.
Normalement, cela ressemblerait à ceci:
[Authorize(Roles = "RoleA,RoleB,RoleC")]
public async Task<ActionResult> Index()
{
}
Mais j'ai stocké mes rôles dans consts, car ils peuvent changer ou être étendus à un moment donné.
public const RoleA = "RoleA";
public const RoleB = "RoleB";
public const RoleC = "RoleC";
Je ne peux pas faire cela, car la chaîne doit être connue au moment de la compilation:
[Authorize(Roles = string.join(",",RoleA,RoleB,RoleC)]
public async Task<ActionResult> Index()
{
}
Existe-t-il un moyen de contourner le problème?
JE POURRAIS écrire un const qui contient simplement "RoleA, RoleB, RoleC" - mais je n'aime pas les chaînes magiques et c'est une chaîne magique. Changer le nom d'un rôle et oublier de changer la chaîne combinée serait un désastre.
J'utilise MVC5. L'identité ASP.NET et le rôle sont connus au moment de la compilation.
c#
asp.net-mvc
authorization
Christian Sauer
la source
la source
Réponses:
Essayez de créer un attribut d'autorisation personnalisé comme celui-ci .
En supposant que vos rôles seront les mêmes pour plusieurs contrôleurs, créez une classe d'assistance:
Ensuite, utilisez-le comme ceci:
la source
Assurez-vous que vous dérivez votre classe d'attributs personnalisée désactivée
System.Web.Mvc.AuthorizeAttribute
et NONSystem.Web.Http.AuthorizeAttribute
.J'ai rencontré le même problème. Une fois que je l'ai changé, tout a fonctionné.
Vous pouvez également ajouter les éléments suivants à votre classe d'attributs personnalisés:
la source
System.Web.Http.AuthorizeAttribute
lieu deSystem.Web.Mvc.AuthorizeAttribute
Le moyen le meilleur et le plus simple que j'ai trouvé pour résoudre ce problème est simplement de concaténer les rôles dans l'attribut Authorize.
avec CustomRole une classe avec des chaînes constantes comme celle-ci:
la source
Ce que j'ai fait est la réponse dans @Tieson
Je peaufine un peu sa réponse. Au lieu d'une chaîne, pourquoi ne pas la convertir en liste?
Voici ma réponse:
Et puis vérifiez si le rôle est valide en remplaçant OnAuthorization
Et là vous l'avez, il valide maintenant si le rôle est autorisé à accéder à la ressource
la source
J'ai l'impression qu'un attribut d'autorisation personnalisé est excessif pour ce problème, sauf si vous avez un grand nombre de rôles.
Étant donné que la chaîne doit être connue au moment de la compilation, pourquoi ne pas créer une classe de rôle statique contenant des chaînes publiques des rôles que vous avez définis, puis ajouter des chaînes séparées par des virgules avec certains rôles que vous souhaitez autoriser:
Et puis vous pouvez utiliser l'attribut Authorize comme ceci sur la classe de contrôleur ou la méthode de contrôleur (ou les deux):
la source
ADMIN_OR_VIEWER
rôle sur l'action est redondant, car vous ne serez pas autorisé à accéder à laCreate
méthode si vous ne possédez pas déjà leADMIN
rôle. Dans ce casVIEWER
, vous ne pourrez jamais appeler laCreate
méthode.