【问题标题】:How do I exclude static files from ASP.NET Core's authorization fallback policy如何从 ASP.NET Core 的授权回退策略中排除静态文件
【发布时间】:2021-11-13 17:34:58
【问题描述】:

我目前正在开发一个应用程序,在该应用程序中我设置了授权回退策略,以避免必须在每个控制器上单独设置策略。问题是您现在必须登录才能访问“wwwroot”(我的前端所在的位置)下的静态文件,这显然是错误的,因为您需要前端才能登录。

有没有办法使用回退策略但从中排除静态文件(例如,以某种方式添加 AllowAnonymous)?还是我走错了路,应该以不同的方式解决这个问题?

编辑:直接访问静态文件 (https://localhost:5001/index.html) 有效,但是当我调用根 url (https://localhost:5001) 和 @987654321 时出现 401 错误@。如果我注释掉后备策略,一切正常。

这是我当前的 Startup.cs(我正在尝试 .NET 6)

授权服务:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .RequireRole(Roles.User)
        .Build();
});

中间件:

var app = builder.Build();

// Configure the HTTP request pipeline.

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web v1"));
}
else
{
    app.UseHsts();
}

app.UseHealthChecks("/health");

app.UseHangfireDashboard();

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();

app.UseAuthorization();

app.UseMiddleware<UserMiddleware>();

app.UseResponseCompression();

app.MapControllers();

app.MapFallbackToFile("index.html");

app.Run();

【问题讨论】:

  • 我不是 100%,确定你想要完成什么。似乎它正在按预期工作。您是否试图让所有 razorpages/endpoints/etc 具有除 homecontroller 控制器及其索引方法之外的后备策略?
  • 您是否尝试重新排序中间件?
  • @mohammadreza 是的,我做到了,尝试将 MapFallbackToFile 中间件放在授权和身份验证之前,但这并没有改变任何东西
  • @Ben 我希望所有东西都有备用策略,除了我的 wwwroot 中的内容。我没有 HomeController 和 index 方法,因为我希望根路径转到 wwwroot 中的 JS 前端
  • @BenMatthews 我认为它现在可以工作,这无疑使我朝着正确的方向前进。不过,我还需要添加新策略。这是我现在的代码,如果你想把它放到你的 anwser 中(带有一点格式:D)

标签: asp.net asp.net-core asp.net-web-api authorization


【解决方案1】:

要让 auth 只访问 razor 页面和控制器,而不要理会其他文件,这应该可以实现:

services.AddRazorPages().AddMvcOptions(options => 
                options.Filters.Add(new AuthorizeFilter("MyCustomPolicy"))
);

【讨论】: