Endpoint 包含授权元数据,但未找到支持授权的中间件

Posted

技术标签:

【中文标题】Endpoint 包含授权元数据,但未找到支持授权的中间件【英文标题】:Endpoint contains authorization metadata, but a middleware was not found that supports authorization 【发布时间】:2020-09-01 20:59:20 【问题描述】:

我目前正在将我本地开发的应用程序迁移到数字海洋中的 Ubuntu 16.04 droplet。我正在使用 .NET Core 3.1 并且已经为它配置了我的服务器。但是,当我导航到我的控制器上使用 [Authorize] 属性的端点时,我只在我的生产服务器(不是本地)上收到以下异常:

An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Endpoint App.Controllers.RsvpController.Index contains authorization metadata, but a middleware was not found that supports authorization.
Configure your application startup by adding app.UseAuthorization() inside the call to Configure(..) in the application startup code. The call to app.UseAuthorization() must appear between app.UseRouting() and app.UseEndpoints(...).
at Microsoft.AspNetCore.Routing.EndpointMiddleware.ThrowMissingAuthMiddlewareException(Endpoint endpoint)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.

这就是我的Configure() 方法在Startup.cs 中的样子:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            
            else
            
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            

            app.UseStaticFiles();

            app.UseRouting();

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

            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "controller=Home/action=Index/id?");
            );
        

我也在ConfigureServices()中使用这个:

            services.AddAuthentication(options =>
            
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            ).AddCookie(options =>
            
                options.LoginPath = new PathString("/Account/Login/");
                options.AccessDeniedPath = new PathString("/Account/Forbidden/");
            );

我的控制器在整个控制器类周围都有[Authorize] 属性:

    [Authorize]
    public class RsvpController : Controller
    
        ...
    

我无法弄清楚问题是什么,因为它在本地工作。我尝试在本地将 ASPNETCORE_ENVIRONMENT 更改为“生产”,以查看是否有基于此的标志,但我仍然遇到问题。提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

在您的Configure 方法中,试试这段代码:

...
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>

    endpoints.MapControllers();
);

【讨论】:

这成功了!非常感谢你,我很惊讶我在其他任何地方都没有看到这个决议。您是否在任何地方的某些文档中看到了这一点? pp.UseAuthentication();app.UseAuthorization(); 的顺序很重要。使用 ASP.NET Core Web API 5.0 预览版。 如果你能添加一些解释或链接就完美了。 基于此文档:ASP.NET Core Middleware - Middleware order 原始问题的顺序应该是正确的 我将添加到答案中:所有方法都必须按特定顺序排列,如答案中所示。【参考方案2】:

在我的情况下,我使用这个命令并且它有效

 app.UseRouting();
        app.UseCors(x => x.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
        );

我像app.UseCors(x =&gt; x.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); 一样使用 CORS,因为我只是在开发应用程序,你可以在 CORS 配置中使用你想要的东西,但中间件的顺序真的很重要。请参阅链接@Massimo 提供。我使用该链接找出解决方案

【讨论】:

【参考方案3】:

对此非常简单的解决方法是将 app.UseAuthorization() 移动到 app.UseRouting() 和 app.UseEndpoints() 之间的任何位置,如下例所示:

app.UseRouting();
//Enable Authentication
app.UseAuthentication();
app.UseAuthorization(); //<< This needs to be between app.UseRouting(); and app.UseEndpoints();
app.UseEndpoints(endpoints =>

    endpoints.MapControllers();
);

【讨论】:

以上是关于Endpoint 包含授权元数据,但未找到支持授权的中间件的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 React 中,我的 axios API 调用有 Authorization Header,其中包含 Bearer <token> 但未被授权并给出 401 错误

MySQL Workbench中两行之间的差异,但未授权LAG

已验证但未授权的 HTTP 状态代码?

Postman授权设置

微信如何授权登录

Java EE 身份验证和授权 [关闭]