web-dev-qa-db-fra.com

Autorisation dans ASP.NET Core. Toujours 401 non autorisé pour l'attribut [Autoriser]

Pour la première fois, je crée une autorisation dans ASP.NET Core. J'ai utilisé le tutoriel d'ici [[# #]] tutoriel [~ # ~]

Le problème est lorsque j'envoie une demande de facteur:

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...

à ma méthode dans le contrôleur décoré avec l'attribut [Authorize].

Je reçois 401 Unauthorized toujours ... J'ai vu des commentaires ci-dessous ce tutoriel et il semble que certaines personnes ont également un problème similaire. Je ne sais pas comment je peux résoudre ce problème.

18
DiPix

À la demande des autres, voici la réponse:

Le problème venait de l'ordre des middlewares dans Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ConfigureAuth(app); // your authorisation configuration

    app.UseMvc();
}

Pourquoi la commande de middleware est importante? Si nous mettons app.UseMvc() en premier - alors les actions MVC entreront dans le routage et s'ils voient l'attribut Authorize, ils prendront le contrôle de sa gestion et c'est pourquoi nous recevons 401 Erreur non autorisée.

J'espère que ça aide quelqu'un;)

23
DiPix

dans ASP.NET Core 3.0, j'ai eu le même problème, ce qui a fonctionné pour moi était:

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

dans la méthode StartUp.Configure.

Ce document montre l'ordre typique des composants middleware: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.

6
eugenecp

Si vous utilisez ASP.NET Core 3.0

Vérifiez cette commande

app.UseAuthentication();

app.UseRouting(); // doit être inférieure à app.UseAuthentication();

Si vous utilisez ASP.NET Core <3.0

Remplacez simplement la app.UseRouting(); par app.UseMvc();

c'est à dire:

app.UseAuthentication();

app.UseMvc(); // doit être inférieure à app.UseAuthentication();

3
Chetha

Dans mon cas, je suivais coreApi , angularClient tutoriel, mais obtenant à chaque fois une erreur non autorisée Dans mon cas angular s'exécute sous Core Projet Api.

Alors j'ai changé l'ordre comme ça et ça marche maintenant

   public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();


        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });


        app.UseSpa(spa =>
        {
            // To learn more about options for serving an Angular SPA from ASP.NET Core,
            // see https://go.Microsoft.com/fwlink/?linkid=864501

            spa.Options.SourcePath = "ClientApp";

            if (env.IsDevelopment())
            {
                spa.UseAngularCliServer(npmScript: "start");
            }
        });


         loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        // global cors policy
        app.UseCors(x => x
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());

    }
2

Mes méthodes ConfigureServices et Configure (Asp.Net Core 3.1.0) dans la classe Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowsAll", builder =>
        {
            builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
        });
    });

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        ...
    });

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseAuthentication();
    app.UseRouting();
    app.UseAuthorization();

    app.UseCors(options => options.AllowAnyOrigin());

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Mon contrôleur:

[Authorize]
[EnableCors("AllowsAll")]
[Route("[controller]")]
public class MyController : MyController
{
    ...
}
1

La solution pour moi était de vérifier l'ordre correct des produits intermédiaires et d'autres choses dans la méthode Configure de démarrage. Généralement app.UseMvc();

0
Christian Arce