Remplacer le filtre d'autorisation global dans ASP.NET Core MVC 1.0
Je suis en train de mettre en place une autorisation de ASP.NET Core 1.0 MVC (6) web app.
Approche plus restrictive, par défaut, je veux restreindre tous les contrôleurs et les méthodes d'action pour les utilisateurs avec Admin
rôle. Donc, je suis à l'ajout d'un mondial autoriser attribut comme:
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("Admin")
.Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});
Alors je veux permettre aux utilisateurs avec des rôles spécifiques à l'accès en béton contrôleurs. Par exemple:
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}
Qui bien sûr ne fonctionne pas, comme le "global filtre" ne permettra pas à la UserManager
pour accéder au contrôleur comme ils ne sont pas des "admins".
Dans MVC5, j'ai été en mesure de mettre en œuvre ce par la création d'une coutume autoriser attribut et en mettant ma logique. Ensuite, à l'aide de cet attribut personnalisé mondial. Par exemple:
public class IsAdminOrAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
if (action.IsDefined(typeof(AuthorizeAttribute), true) ||
action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true))
{
return;
}
base.OnAuthorization(filterContext);
}
}
J'ai essayé de créer un personnalisé AuthorizeFilter
mais sans succès. API semble être différent.
Donc ma question est: Est-il possible de mettre en place la stratégie par défaut et ensuite le remplacer par des contrôleurs spécifiques et des actions. Ou quelque chose de similaire.
Je ne veux pas aller avec cette
[Authorize(Roles="Admin,[OtherRoles]")]
sur chaque contrôleur/action, car c'est un problème de sécurité potentiel. Ce qui va se passer si j'ai accidentellement oubliez pas de mettre le Admin
rôle.
source d'informationauteur regnauld
Vous devez vous connecter pour publier un commentaire.
Vous aurez besoin de jouer avec le cadre un peu depuis votre politique globale est plus restrictive que celle que vous souhaitez appliquer à des contrôleurs spécifiques et des actions:
UsersController
)Comme vous l'avez déjà noticied, avoir un filtre global signifie que seuls les Admin les utilisateurs auront accès à un contrôleur. Lorsque vous ajoutez l'attribut supplémentaire sur le
UsersController
seuls les utilisateurs qui sont les deux Admin et UserManager auront accès.Il est possible d'utiliser une approche similaire à la MVC 5, mais il fonctionne d'une manière différente.
[Autoriser]
attribut ne contient pas la logique d'autorisation.AuthorizeFilter
est celui qui a unOnAuthorizeAsync
méthode d'appeler le service d'autorisation de assurez-vous que les politiques sont satisfaits.IApplicationModelProvider
est utilisée pour ajouter unAuthorizeFilter
pour chaque contrôleur et l'action qui a un[Authorize]
attribut.Une option pourrait être de recréer votre
IsAdminOrAuthorizeAttribute
mais cette fois comme unAuthorizeFilter
que vous pourrez ensuite ajouter un filtre global:Cela s'applique à votre filtre global uniquement lorsque le contrôleur/action n'est pas spécifique
[Authorize]
attribut.Vous pouvez aussi éviter d'avoir un filtre global par l'injection vous-même dans le processus qui génère les filtres à appliquer pour chaque contrôleur et l'action. Vous pouvez ajouter votre propre
IApplicationModelProvider
ou de votre propreIApplicationModelConvention
. Les deux vous permettent d'ajouter/supprimer un contrôleur spécifique et les actions des filtres.Par exemple, vous pouvez définir une valeur par défaut de la stratégie d'autorisation et extra-politiques spécifiques:
Ensuite, vous pouvez créer un nouveau
IApplicatioModelProvider
qui va ajouter de la politique par défaut pour chaque contrôleur qui n'a pas son propre[Authorize]
attribut (Une application de la convention serait très semblable et sans doute plus en adéquation avec la façon dont le cadre est destiné à être étendu. Je viens de rapidement s'est servi desAuthorizationApplicationModelProvider
comme un guide):Dans ce lieu, la politique par défaut sera utilisé sur ces 2 contrôleurs:
Et des Utilisateurs spécifiques de la politique sera utilisé ici:
Avis qu'il faut encore ajouter le rôle d'administrateur à chaque politique, mais au moins, toutes vos politiques seront déclarés dans une seule méthode de démarrage. Vous pourriez probablement créer vos propres méthodes pour construire des politiques qui permettront de toujours ajouter le rôle admin.
À l'aide de @Daniel solution que j'ai rencontré le même problème mentionné par @TarkaDaal dans le commentaire (il y a 2
AuthorizeFilter
dans le cadre de chaque appel...pas tout à fait sûr où ils viennent).Donc ma façon de le résoudre est le suivant:
C'est moche mais ça fonctionne dans ce cas, parce que si vous êtes seulement en utilisant l'Autoriser attribut sans arguments, vous allez être traitées par le
new AuthorizationPolicyBuilder().RequireRole("admin").Build()
filtre de toute façon.