2017-05-16 9 views
0

Je voudrais pouvoir spécifier un rôle auquel un utilisateur n'est pas autorisé à accéder et un site entier lorsque tous les autres les utilisateurs sont. Je voudrais alors pouvoir faire quelque chose dans le sens d'un entête d'autorisation sur les actions sélectionnées afin que l'utilisateur refusé soit toujours autorisé à accéder à cette action et à ce contrôleur si possible.Comment refuser un accès rôle/utilisateur à tous les contrôleurs/actions en dehors des exceptions spécifiées asp.net MVC

Je sais que je pourrais créer un rôle, ajouter tous les autres utilisateurs à ce rôle et faire un attribut d'autorisation sur ce rôle, mais cela devrait être fait sur chaque action est un non-démarrage parce que le projet est déjà construit avec des centaines voire des milliers d'actions.

Donc, des suggestions seront appréciés

+0

La sécurité n'est pas facile. Si vous l'avez construit sans sécurité et que vous avez créé des «milliers» d'actions, vous avez beaucoup de travail devant vous, quelle que soit la solution que vous utilisez. Donc, en rejetant immédiatement quelque chose comme trop de travail se traduira par pas assez de sécurité. –

+0

@ErikFunkenbusch Il est actuellement sécurisé là où il doit utiliser Authorize, mais cela ne me donne pas la possibilité de bloquer un utilisateur ou un rôle de ce que je peux rassembler. S'il y a une solution que je peux mettre en œuvre pour autoriser, je serai plus qu'heureux de faire un essai! – jjr2000

+0

Il n'y a pas de fonctionnalité "Refuser" dans AuthorizeAttribute, uniquement Autoriser. Si vous souhaitez utiliser l'autorisation standard, vous devez rendre vos rôles plus précis et attribuer uniquement les rôles auxquels un utilisateur a accès.En général, en particulier lorsque vous avez "des milliers" d'actions et de nombreux utilisateurs, il n'est pas possible d'autoriser ou de refuser spécifiquement les utilisateurs sur des actions. Vous auriez probablement besoin de construire une sorte d'accès piloté par les données, ce qui n'est pas trivial. En outre, beaucoup dépend des versions exactes de mvc que vous utilisez, et des formes exactes d'authentification/autorisation que vous utilisez. –

Répondre

1

La solution la plus simple ici serait probablement une coutume Autorisez attribut pour ajouter des fonctionnalités Deny. Vous pouvez implémenter ceci de plusieurs façons. Par exemple, vous pouvez refuser en fonction d'un rôle spécifique, mais cela peut être difficile à maintenir au fil du temps si vous souhaitez refuser des personnes de différentes parties de l'application, vous devez créer des rôles différents et modifier votre code chaque fois que vous le souhaitez. pour faire ça.

Par exemple:

public class DenyAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     return !base.AuthorizeCore(httpContext); 
    } 
} 

Il utilise la propriété Rôles du AuthorizeAttribute comme nier.

[Deny(Roles="DeniedUsers")] 

Sachez cependant, que vous auriez besoin d'une sorte d'autorisation de niveau supérieur, par exemple au contrôleur ou au niveau filtre global qui bloque les utilisateurs général non authentifiés, il serait par ailleurs permettre à quiconque pas le rôle indiqué d'avoir accès , y compris les utilisateurs non authentifiés. Alors peut-être ajouter quelque chose comme:

return httpContext.User.IsAuthenticated && !base.AuthorizeCore(httpContext); 

Il faut aussi savoir que l'utilisation de cette option conjointement avec un [AllowAnonymous] pourrait être problématique.

Une autre option consisterait à créer un système plus flexible qui calculerait le refus en fonction du contrôleur/de l'action en cours. Quelque chose comme ceci:

public class DenyByControllerActionAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var controller = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller"); 
     var action = httpContext.Request.RequestContext.RouteData.GetRequiredString("action"); 
     var denyRole = string.Format("Deny{0}:{1}", controller, action); 
     return !httpContext.User.IsInRole(denyRole) && base.AuthorizeCore(httpContext); 
    } 
} 

que vous pouvez ensuite contrôler l'accès en ajoutant l'utilisateur à un rôle du format « Deny {Controller}: {action} », donc quelque chose comme DenyHome: Index ou « DenyAdmin: E-mail » .

Cela nécessitera également qu'ils aient un accès par défaut par défaut en appelant la fonctionnalité de base AuthorizeCore. Donc, vous pouvez faire un remplacement en gros de [Authorize] avec `[[DenyByControllerAction]] et cela fonctionnera de la même façon (ou l'utiliser comme filtre global), mais en ajoutant simplement le rôle que vous pouvez refuser à n'importe quel utilisateur.

+0

Le nier va travailler pour mes fins, merci pour l'aide! – jjr2000

+0

@ jjr2000 - Gardez juste à l'esprit l'avertissement que j'ai mentionné. Vous devrez peut-être effectuer des tests approfondis dans votre environnement pour vous assurer que la sécurité est ce que vous attendez d'elle. –