【问题标题】:Authorization in ASP.NET Core. Always 401 Unauthorized for [Authorize] attributeASP.NET Core 中的授权。 [Authorize] 属性总是 401 Unauthorized
【发布时间】:2017-09-20 08:03:43
【问题描述】:

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

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

Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6I...

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

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

【问题讨论】:

  • JwtBearerMiddleware 应该会产生很多日志事件。在Startup.Configure 方法中添加一个记录器并检查它。
  • @DiPix,如果您在此处发布您的答案将会很有帮助,以便我们了解发生了什么。否则对登陆此页面的其他人没有帮助。
  • 对@Ray 评论的每个点赞都应该代表那些寻找 DiPix 所做的事情的人。 :|
  • @Irwin 我发布了答案:)
  • 请重命名或删除此问题,因为您给出的答案与调试无关。

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


【解决方案1】:

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

问题在于 Startup.cs 中的中间件顺序

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

    app.UseMvc();
}

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

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

【讨论】:

  • 如果您使用的是 ASP.NET Core 3.0 预览版,请将 UseMvc 替换为 UseRouting
  • 在我的情况下,我忘记在app.UseMvc() 之前添加app.UseAuthentication(),这可能是上面的ConfigureAuth(app) 所调用的
  • 快 2 年了,我还有这个!!
  • @BaltzarMattson 你能做出新的回答吗
  • @goamn 不确定新答案会提供什么,只需确保顺序为:app.UseAuthentication() 然后app.UseMvc()
【解决方案2】:

在 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

【讨论】:

    【解决方案3】:

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

    检查此订单

    app.UseAuthentication();

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

    如果您使用的是 ASP.NET Core

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

    即:

    app.UseAuthentication();

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

    【讨论】:

    【解决方案4】:

    在我的情况下,我正在关注 coreApi,angularClient 教程,但每次都会出现未经授权的错误在我的情况下,角度应用程序正在 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());
    
        }
    

    【讨论】:

      【解决方案5】:

      Startup 类中的我的 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
      {
          ...
      }
      

      【讨论】:

      • 谢谢!谢谢!谢谢!我以前在 UseAuthentication() 和 UseAuthorization() 之前有 UseRouting()。这在本地运行时效果很好,但一旦部署到 Web 服务器,所有内容都会返回 401。我看到答案说我应该在 UseRouting() 之前使用 UseAuthentication(),所以我试图将 UseAuthentication() 和 UseAuthorization() 都放在 UseRouting() 之前,但这不起作用。把这三个按你上面描述的顺序排列结束了我一天的头痛。
      • 请标记为答案。
      【解决方案6】:

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

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

      【讨论】:

      • 这个答案已经存在于上面。
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-10
        • 2021-05-20
        • 2016-09-13
        • 1970-01-01
        • 2014-12-19
        • 2020-06-30
        • 2018-01-09
        相关资源
        最近更新 更多