ASP.NET 核心中的授权。 [Authorize] 属性总是 401 Unauthorized

Authorization in ASP.NET Core. Always 401 Unauthorized for [Authorize] attribute

我第一次在 ASP.NET Core 中创建授权。 我使用了这里的教程 TUTORIAL

问题是当我从邮递员发送请求时:

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...

我在用 [Authorize] 属性装饰的控制器中的方法。

我总是收到 401 Unauthorized...我看到该教程下面的评论,似乎有些人也有类似的问题。我不知道如何解决这个问题。

应他人的要求,这里是答案:

问题出在 Startup.cs

中的中间件顺序
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ConfigureAuth(app); // your authorisation configuration

    app.UseMvc();
}

为什么中间件顺序很重要?如果我们将 app.UseMvc() 放在首位 - 那么 MVC 操作将进入路由,如果他们看到 Authorize 属性,他们将控制其处理,这就是我们收到 401 未授权错误的原因。

希望对大家有所帮助 ;)

我的解决方案是在 Startup 的 Configure 方法中检查中间件和其他内容的正确顺序。一般app.UseMvc();

在我的例子中,我遵循了 coreApi,angularClient 教程,但每次都会出现未经授权的错误在我的例子中,angular 应用程序 运行 在核心 Api 项目下。

然后我像这样更改了顺序,现在可以使用了

   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());

    }

如果您使用的是 ASP.NET Core 3.0

查看此订单

app.UseAuthentication();

app.UseRouting(); //必须低于app.UseAuthentication();

如果您使用的是 ASP.NET Core < 3.0

只需将 app.UseRouting(); 替换为 app.UseMvc();

即:

app.UseAuthentication();

app.UseMvc(); //必须低于app.UseAuthentication();

在 ASP.NET Core 3.0 中,我遇到了同样的问题,对我有用的是:

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

在 StartUp.Configure 方法中。

此文档显示了中间件组件的典型顺序: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0

我的 ConfigureServices 和 Configure 方法(Asp.Net Core 3.1.0)在 Startup class:

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

我的控制器:

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

对于 .NET CORE 3.0 或更高版本的用户,此订单在 "configure" 位于 StartUp.cs

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

在我的例子中,我还使用了 app.MapWhen(代码)和 app.UseAuthentication();应该在map之前,像这样

app.UseAuthentication();
app.MapWhen();
app.UseMvc();

希望这会有所帮助。