.NET Core Omija lub wyłącza [Autoryzacja(Role="")] podczas lokalnego rozwoju

0

Pytanie

Mam następujący kod do obejścia dodać uwierzytelniania podczas lokalnego rozwoju, używam Azure AD i .NET Core.

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

Jednak, ponieważ mój sterownik jest zabezpieczony atrybutem autoryzacji, jak obejść atrybut autoryzacji wewnątrz sterownika podczas lokalnego rozwoju:

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

W .NET Framework mam poniższy kod, aby zastąpić atrybutu Autoryzacji:

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

Jaki jest równoważny kod .NET Core ? czy jest jakiś inny sposób zastąpić atrybut autoryzacji w klasie Startup.cs ?

3
2

Myślę, że można użyć IClaimsTransformation za to. W tym przypadku ja tylko dodam rolę dla wszystkich, ale gdy jest podłączony, to będzie działać tylko wtedy, gdy jesteś w rozwoju (uwaga: musisz upewnić się, że zmienna środowiskowa została poprawnie zainstalowana, aby IsDevelopment działa).

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;
    }
}
Startup.cs
// Only in dev
if (builder.Environment.IsDevelopment())
{
    builder.Services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();
}

To powinno wystarczyć do ASP.NET Rdzeń 3.1 zgodnie z dokumentami Microsoft. Jednak ja testowałem go przeciwko .NET 6 (w .NET 6 szablony dla nowych stron podróżują Startup.cs rzeczy w Program.cs).

Jeszcze jedna uwaga, jeśli opierać się na IsDevelopment hydraulika, który znajduje się na WebHostEnvironment nie trzeba korzystać z dyrektywy kompilatora. W ten sposób, jak tylko środa skonfigurowany, to będzie działać, jak by jej tam ani развертывали (na przykład, nie ma szans, że losowe debugowania montaż zamieni ją w środowisko, w którym ona nie musi być).

2021-11-23 23:24:51
2

Zamiast tego, aby wyraźnie określić role, które są wymagane do każdego kontrolera z [Authorize(Roles...można użyć [Authorize(Policy... aby dodać warstwę косвенности.

W ten sposób można podjąć decyzję w swoim StartUp klasa (lub w IConfigureOptions<AuthorizationOptions> serwis), dokładnie to, co oznacza, że każda polityka. W tym wszelkie inne dziwne wymagania, które mogą wystąpić.

[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 rozumiem, dziękuję
VR1256
0

Naprawiłem to za pomocą poniższy kod, dzięki Jeremy za właściwy kierunek:

W klasie kontrolera użyłem autoryzację na podstawie zasad:

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

W start.cs możemy dodać uwierzytelnianie i autoryzację na podstawie warunków DEBUGOWANIA:

#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
                });
            });

Dla RequireAuthenticatedUser() w trybie debugowania stosujemy poniższy kod, aby dodać atrybut AllowAnonymous na wszystkich kontrolerach:

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

W innych językach

Ta strona jest w innych językach

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