.NET de Base de Dérivation ou désactiver [Autoriser(Rôles="")] cours de développement local

0

La question

J'ai ci-dessous le code de contourner l'ajout de l'authentification au cours du développement local, je suis en utilisant Azure AD & .NET de Base.

#if !DEBUG
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
               .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
#endif

Cependant depuis que j'ai mon contrôleur protégés par Autoriser attribut, comment puis-je contourner les Autoriser attribut à l'intérieur de Contrôleur au cours du développement local:

[Authorize(Roles = "Buyer")]
public class ProductController : ApiBaseController
{
}

Dans .NET Framework j'ai ci-dessous le code pour remplacer les Autoriser attribut:

public class MyAuthorizeAttribute : AuthorizeAttribute
    {
     #if DEBUG
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return true;
        }
     #endif
    }

Quel est l'équivalent du code .NET de Base ? ou est-il un autre moyen nous pouvons remplacer Autoriser l'attribut de Démarrage.cs de la classe ?

3
2

Je pense que vous pouvez utiliser un IClaimsTransformation pour cela. Dans ce cas, je vais juste ajouter un rôle à tout le monde, mais quand il est branché il ne fera que faire si vous êtes dans le développement (remarque: Vous devez assurez-vous que la variable d'environnement est correctement réglé de sorte IsDevelopment les travaux).

AddRolesClaimsTransformation.cs
/// <summary>
/// Adds roles to a user on the fly, this will hard code a Buyer role for everyone.
/// </summary>
public class AddRolesClaimsTransformation : IClaimsTransformation
{
    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        // Clone current identity
        var clone = principal.Clone();
        var ident = (ClaimsIdentity)clone.Identity;

        ident.AddClaim(new Claim(ClaimTypes.Role, "Buyer"));

        return clone;
    }
}
De démarrage.cs
// Only in dev
if (builder.Environment.IsDevelopment())
{
    builder.Services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();
}

Cela devrait fonctionner pour ASP.NET de Base 3.1 selon Microsoft docs. Je l'ai testé contre .NET 6 cependant (en .NET 6 les modèles pour de nouveaux sites de déplacer le Startup.cs des trucs dans Program.cs).

Une autre note de côté, si vous comptez sur la IsDevelopment plomberie sur le WebHostEnvironment vous n'aurez pas à utiliser les directives du compilateur. De cette façon, une fois l'environnement de l'installation, il va juste travailler cependant de le déployer (par exemple il n'y a pas une chance à un accident Debug build va le faire dans un environnement qu'il n'est pas censé être dans).

2021-11-23 23:24:51
2

Plutôt que de spécifier explicitement les rôles de chaque contrôleur avec [Authorize(Roles..., vous pouvez utiliser [Authorize(Policy... pour ajouter une couche d'indirection.

De cette façon, vous pouvez décider de votre StartUp classe (ou dans un IConfigureOptions<AuthorizationOptions> service), exactement ce que chaque politique. Y compris tout autre bizarre exigences que vous pourriez avoir.

[Authorize(Policy= "Buyer")]
public class ProductController : ApiBaseController

...

services.AddAuthorization(o =>
{
    o.AddPolicy("Buyer", b => {
#if DEBUG
        b.RequireAuthenticatedUser();
#else
        b.RequireRole("Buyer");
#endif
    });
});
2021-11-23 23:18:53

Nvm je l'ai eu merci
VR1256
0

J'ai eu de travail à l'aide de code ci-dessous merci à Jeremy pour la bonne direction:

En classe de Contrôleur, j'ai utilisé de la Politique d'autorisation basé sur:

 [Authorize(Policy= "Buyer")]
 public class ProductController : ApiBaseController
 {
 }

Dans le début.cs, nous pouvons ajouter d'authentification et d'autorisation basé sur le DÉBOGAGE de conditions:

#if !DEBUG
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
               .AddMicrosoftIdentityWebApi(config.GetSection("AzureAd"));
#endif

            services.AddAuthorization(options =>
            {
                // policy for read access
                options.AddPolicy("Buyer", policy =>
                {
#if DEBUG
                    policy.RequireAuthenticatedUser();
#else
                    policy.RequireRole("Buyer");
#endif
                });
            });

Pour RequireAuthenticatedUser() en mode de débogage, nous utilisons code ci-dessous pour ajouter AllowAnonymous attribut sur tous les contrôleurs de:

app.UseEndpoints(endpoints =>
            {
#if DEBUG
                endpoints.MapControllers().WithMetadata(new AllowAnonymousAttribute());
#else
                    endpoints.MapControllers();
#endif
            });
2021-11-24 00:59:47

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................