0

Je cherche un moyen "facile" d'ajouter automatiquement des revendications de rôle à l'utilisateur local afin de tester ma logique d'autorisation; c'est-à-dire vouloir ajouter des revendications spécifiques à l'utilisateur local avant qu'elles ne soient autorisées par mes contrôleurs..NET Core MVC ajoute une revendication de rôle à l'utilisateur local en cours de développement avant l'autorisation

J'ai appris que dans le passé quelque chose semblable à cela pourrait être fait pour les contrôleurs:

#if DEBUG 
protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    var roles = new[] { "role-under-test"}; 
    HttpContext.User = new GenericPrincipal(new GenericIdentity("DebugUser"), roles); 
    base.OnAuthorization(filterContext); 
} 
#endif 

Pourtant, c'était avant de base .NET qui est ce que je travaille maintenant. Lentement j'ai travaillé mon chemin vers le code présenté ci-dessous, qui semble fonctionner, mais est clairement beaucoup plus compliqué que l'exemple ci-dessus. Donc, ma question est de savoir si quelqu'un connaît un meilleur - plus facile - moyen d'y parvenir?

L'attribut d'autorisation personnalisée:

public class CustomAuthAttribute : RolesAuthorizationRequirement { 
    public CustomAuthAttribute(IEnumerable<string> allowedRoles) : base(allowedRoles) { } 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement) { 
#if DEBUG 
     context.User.AddIdentity(new ClaimsIdentity(new GenericIdentity("DebugUser"), new[] { 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "users"), 
      new Claim(ClaimsIdentity.DefaultRoleClaimType, "admins") 
     })); 
#endif 
     return base.HandleRequirementAsync(context, requirement); 
    } 
} 

Dans Startup.cs

public void ConfigureServices(IServiceCollection services) { 
    // ... 

    services.AddAuthorization(options => 
     options.AddPolicy("UsersAndAdmins", 
      policy => policy.AddRequirements(new CustomAuthAttribute(new []{"users", "admins"})))); 
} 

Et puis l'utiliser dans les contrôleurs:

[Authorize(Policy = "UsersAndAdmins")]  
public class HomeController : Controller { 
    // ... 
+1

Avez-vous vérifié https: // channel9.msdn.com/ Blogs/Seth-Juarez/Advanced-aspNET-Core-Autorisation-avec-B arry-Dorrans sur le canal 9. Il semble qu'ils vous aideraient beaucoup. C'est une série de 2 vidéos, mais il y a beaucoup de bonnes infos là-dedans. c'est en fait le deuxième des deux –

Répondre

1

Vous voulez demandes de transformation;

Ecrire une transformation de revendications qui ressemble à

public class ClaimsTransformer : IClaimsTransformer 
{ 
    public Task<ClaimsPrincipal> TransformAsync(ClaimsTransformationContext context) 
    { 
     ((ClaimsIdentity)context.principal.Identity).AddClaim(new Claim("Admin", "true")); 
     return Task.FromResult(principal); 
    } 
} 

et câbler à l'intérieur Configure dans startup.cs

app.UseClaimsTransformation(new ClaimsTransformationOptions 
{ 
    Transformer = new ClaimsTransformer() 
}); 

Bien sûr, s'il est pour le test que vous souhaitez envelopper dans un contrôle de l'environnement pour assurer vous êtes dans votre environnement de développement :)

+0

Avez-vous essayé ce code vous-même? Avec IClaimsTransformer, j'ai dû implémenter la tâche publique TransformAsync (ClaimsTransformationContext) 'plutôt que la fonction que vous avez mentionnée plus haut. Mais à part ça la réponse était certainement une réponse qui m'a aidé, donc je l'accepterai comme réponse si vous éditez la réponse pour refléter ce commentaire. :) –

+1

Hah, non, ça a changé par RTM. Mon mauvais, désolé d'être si paresseux – blowdart