. NET Core Yerel geliştirme sırasında [Authorize(Roles="")] öğesini atlar veya kapatır

0

Soru

Yerel geliştirme sırasında kimlik doğrulaması eklemeyi atlamak için aşağıdaki kodum var, Azure AD&. NET Core kullanıyorum.

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

Ancak denetleyicim Authorize özniteliği tarafından korunduğundan, yerel geliştirme sırasında Denetleyicinin içindeki Authorize özniteliğini nasıl atlayabilirim:

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

. NET Framework'te Authorize özniteliğini geçersiz kılmak için aşağıdaki kodum var:

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

. NET Core için eşdeğer kod nedir ? veya Başlangıçta Authorize özniteliğini geçersiz kılabileceğimiz başka bir yol var mı?cs sınıfı mı ?

3
2

Bence bir tane kullanabilirsin. IClaimsTransformation bunun için. Bu durumda, herkese bir rol ekleyeceğim, ancak bağlandığında yalnızca geliştirme aşamasındaysanız bunu yapacaktır (not: Ortam değişkeninin doğru şekilde ayarlandığından emin olmanız gerekir IsDevelopment çalışma).

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

Bu işe yaramalı ASP.NET Microsoft belgelerine göre Çekirdek 3.1. Ancak. NET 6'ya karşı test ettim (. NET 6'da yeni siteler için şablonlar Startup.cs içine şeyler Program.cs).

Başka bir yan not, eğer güveniyorsanız IsDevelopment üzerinde sıhhi tesisat var WebHostEnvironment derleyici yönergelerini kullanmak zorunda kalmazsınız. Bu şekilde, ortam kurulduktan sonra, onu oraya dağıttığınız gibi çalışacaktır (örneğin, yanlışlıkla bir Hata Ayıklama yapısının onu içinde olmaması gereken bir ortama dönüştürmesi ihtimali yoktur).

2021-11-23 23:24:51
2

Her denetleyicinin gerektirdiği rolleri açıkça belirtmek yerine [Authorize(Roles... olabilir kullanın [Authorize(Policy... bir yönlendirme katmanı eklemek için.

Bu şekilde kendi kararınızı verebilirsiniz. StartUp sınıf (veya bir IConfigureOptions<AuthorizationOptions> hizmet), her politikanın tam olarak ne anlama geldiği. Sahip olabileceğiniz diğer garip gereksinimler de dahil.

[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 anladım teşekkür ederim
VR1256
0

Doğru yön için Jeremy'ye teşekkürler, aşağıdaki kodu kullanarak çalışmaya başladım:

Denetleyici sınıfında İlke tabanlı yetkilendirme kullandım:

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

Başlat.cs HATA ayıklama koşullarına göre kimlik doğrulama ve yetkilendirme ekleyebiliriz:

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

Hata ayıklama modunda RequireAuthenticatedUser () için tüm denetleyicilere AllowAnonymous özniteliği eklemek için aşağıdaki kodu kullanırız:

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

Diğer dillerde

Bu sayfa diğer dillerde

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