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.
À 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;)
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.
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();
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());
}
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
{
...
}
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();