ASP.NET Core 与 Angular 项目中的授权中间件异常

问题描述 投票:0回答:1

我的项目中有以下中间件顺序:

程序.cs:

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseCors("MyOrigin");

app.UseRouting();

app.UseAuthentication();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");

app.MapFallbackToFile("index.html");

app.Run();

我研究了相关帖子这里。我尝试了以下顺序:

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseCors("MyOrigin");

app.UseAuthentication();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");

app.MapFallbackToFile("index.html");

app.Run();

但我仍然收到以下错误:

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware1 执行请求时发生未处理的异常。 System.InvalidOperationException:端点维护CMS.Controllers.ApiPmSchedualController.UploadNewPmFile (MaintenanceCMS) 包含授权元数据,但中间件是 没有发现支持授权。 通过在应用程序启动代码中添加 app.UseAuthorization() 来配置应用程序启动。如果有 调用 app.UseRouting() 和 app.UseEndpoints(...),调用 app.UseAuthorization() 必须位于它们之间。

我该如何解决这个问题?

更新: 我在 VS Code 中使用 dotnet cli (.NET 7)。

更新2:整个程序.cs

var builder = WebApplication.CreateBuilder(args);

//Adding Configuration service to the project
IConfigurationRoot configuration = new ConfigurationBuilder()
    .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
    .AddJsonFile("appsettings.json")
    .AddEnvironmentVariables()
    .Build();

builder.Services.AddDbContext<SqlServerContext>(options => options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")));

#region Add CORS
builder.Services.AddCors((setup) =>
{
    setup.AddPolicy("MyOrigin", (options) =>
    {
        options.AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin();
    });
});
#endregion

builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!)),
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidIssuer = configuration["Jwt:Issuer"],
        ValidAudience = configuration["Jwt:Issuer"],
    };
});

// Add services to the container.

builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    // 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.UseHttpsRedirection();

app.UseCors("MyOrigin");

app.UseStaticFiles();

app.UseAuthentication();

app.UseRouting();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");

app.MapFallbackToFile("index.html");

app.Run();
c# asp.net-core authorization
1个回答
0
投票

但我仍然得到以下信息 错误:Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware1 执行请求时发生未处理的异常。 System.InvalidOperationException:端点 MaintenanceCMS.Controllers.ApiPmSchedualController.UploadNewPmFile (MaintenanceCMS) 包含授权元数据,但中间件是 没有发现支持授权。配置您的应用程序 通过在应用程序启动中添加 app.UseAuthorization() 来启动 代码。如果有对 app.UseRouting() 的调用并且 app.UseEndpoints(...),对 app.UseAuthorization() 的调用必须进行 它们之间。我该如何解决这个问题?

根据您的错误消息和共享代码片段,您的中间件订单和配置似乎不正确。因为,根据对端点路由有效的authorization,对 UseAuthorization 的调用应该出现在对 UseRouting 和 UseEndpoints 的调用之间。如果没有,后备策略(如果配置)将用于授权所有请求。

但是,您的 UseAuthorization 已放置在路由之后,但缺少 UseEndpoints。除此之外,CORS 应该排列在路由之后、身份验证之前。因此,您应该执行以下操作:

app.UseStaticFiles();       
app.UseRouting();
app.UseCors("MyOrigin");
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
     endpoints.MapControllerRoute(
     name: "default",
     pattern: "{controller}/{action=Index}/{id?}");
});

注意:参考这个官方文档,这对于这种情况会有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.