0

Ce n'est pas une question en double ou plutôt les solutions données dans d'autres solutions n'ont pas fonctionné.Autorisation dynamique des rôles noyau asp.net

permet de dire il y a un cntroller

[Authorize(Roles=//set dynamically)] 
public IActionResult DashBoard(LoginModel model) 
{ 
} 

J'ai essayé les solutions dans les questions suivantes

1) Add roles to authorize attribute

2) dynamically assign controller action permissions to roles

3) dynamically add roles to authorize attribute for controller (erreur: Méthode de poignée - aucune méthode appropriée trouvée pour remplacer)

4) can policy based authorization be more dynamic

Toutes ces solutions ne fonctionnent pas car les méthodes substituées dans les interfaces ne sont pas présentes (par ex. authorizeAttribute ne contient pas de définition pour AuthorizeCore) ou, dans certains cas, les services IServiceCollection ne contiennent pas de méthode particulière

+0

La réponse est vraiment bonne ... https: // stackoverflow.com/a/31465227/4755704 – Coemgen

+0

J'ai déjà essayé. La définition AuthorizationContext n'est pas trouvée et comme pour la méthode handle, aucune méthode appropriée n'a été trouvée pour remplacer –

Répondre

3

Vous ne pouvez pas faire cela. [Authorize(Roles=//set dynamically)] doit être connu au l'heure de compilation. Également utiliser des rôles pour cette raison est déconseillé comme indiqué dans le post lié de blowdart à partir de commentaires. Au lieu de cela, vous devez utiliser des revendications et des stratégies. Les revendications sont des autorisations détaillées, par exemple "CreateCustomer" ou "DeleteCustomer" ou "ViewDashboard".

donc vous devez l'utiliser comme

[Authorize(Policy = "ViewDashboard")] 

Ces politiques doivent être savoir au moment de la compilation.

public class ViewDashboardRequirement : AuthorizationHandler<ViewDashboardRequirement>, IAuthorizationRequirement 
{ 
    public override void Handle(AuthorizationContext context, ViewDashboardRequirement requirement) 
    { 
     if (context.User.HasClaim(c => c.Type == "dashboard:read")) 
     { 
      context.context.Succeed(requirement); 
      return; 
     } 

     // only call fail if you do not want that other AuthorizationHandler may succeed with 
     // a different requirement 
     // context.Fail(); 
    } 
} 

Pour un exemple sur la façon de générer un gestionnaire générique (au lieu d'écrire un nouveau gestionnaire pour chaque politique) voir ma réponse here.

Cela vous permettra de créer des rôles configurables. Maintenant vous pouvez créer des rôles qui consistent en un sac de revendications. Chaque réclamation peut être une politique. Lorsque l'utilisateur se connecte, vous ajoutez les revendications qui appartiennent à un rôle à la liste des revendications des utilisateurs.

-à-dire

  • Soutien: ViewDashboard, ViewCustomers, ViewContacts, ManageCases (billets de soutien)
  • Manager: ViewDashboard, ManageCustomers (Voir, Modifier, Supprimer), ManageContacts (affichage, édition, supprimer)
  • administrateur: ManageDashboard (affichage, édition)

etc.

Mettre à jour à partir de Commentaires.

You should be able to utilize ASP.NET Core Identity's claim and roleclaim abilities w/o changing a line of code, therefor you have the IdentityRole and IdentityRoleClaim classes. At runtime, you add a new IdentityRole (i.e. "Manager") and then add multiple IdentityRoleClaim (one for each permission/policy)

+0

Le problème auquel je suis confronté est que dans la classe d'exigence, j'ai besoin d'appeler db. pour lequel j'ai besoin d'ajouter un datacontext. mais tout objet créé de cette classe aura besoin d'un objet datacontecxt –

+0

Non, vous n'avez pas besoin d'appeler db. L'exigence devrait fonctionner sur les ** réclamations de l'utilisateur **. Lorsque vous vous connectez, vous mettez les revendications requises dans le [ClaimsPrenicipal] (https://github.com/dotnet/corefx/blob/master/src/System.Security.Claims/src/System/Security/Claims/ClaimsPrincipal .cs # L16). Ensuite, chaque fois que l'utilisateur s'authentifie, vous pouvez accéder aux revendications depuis 'HttpContext.User.HasClaim (...)' ou 'HttpContext.User.FindFirst (...)'. Un rôle est alors un ensemble de revendications qui peuvent être configurées à l'exécution (ajouter de nouveaux rôles signifie créer un rôle et y ajouter certaines revendications – Tseng

+0

Une "revendication" est un peu plus qu'une permission spécifique comme "ViewCustomers" ou "ManageCustomers" " – Tseng