ASP.NET Core中的授权。始终401未授权[授权]属性

时间:2017-04-23 17:52:00

标签: c# asp.net asp.net-core authorization bearer-token

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

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

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...

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

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

7 个答案:

答案 0 :(得分:12)

应其他人的要求,答案是:

问题在于Startup.cs中的中间件订单

Sub x()

Dim ir As Long

ir = Range("H" & Rows.Count).End(xlUp).Row

Range("H" & ir + 1).FormulaR1C1 = "=SUMIF(R[-" & ir & "]C[-5]:R[-1]C[-5],""*total*"",R[-" & ir & "]C:R[-1]C)"

End Sub

为什么中间件订单很重要?如果我们先放置public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ConfigureAuth(app); // your authorisation configuration app.UseMvc(); } - 那么MVC操作将进入路由,如果他们看到Authorize属性,他们将控制其处理,这就是我们收到401 Unauthorized错误的原因。

我希望它可以帮到某人;)

答案 1 :(得分:2)

就我而言,我一直在遵循coreApiangularClient教程,但是每次都出现未经授权的错误,就我而言,Angular应用程序正在Core 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());

    }

答案 2 :(得分:2)

如果您使用的是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();

答案 3 :(得分:1)

在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

答案 4 :(得分:1)

启动类中的我的ConfigureServices和Configure方法(Asp.Net Core 3.1.0):

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
{
    ...
}

答案 5 :(得分:1)

对于.NET CORE 3.0或更高版本的用户,此顺序位于StartUp.cs中的“配置”中

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

答案 6 :(得分:0)

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