如何从 ASP.NET Core 的授权回退策略中排除静态文件
How do I exclude static files from ASP.NET Core's authorization fallback policy
我目前正在开发一个应用程序,我在其中设置了授权回退策略以避免必须在每个控制器上单独设置策略。问题是你现在必须登录才能访问“wwwroot”(我的前端所在的位置)下的静态文件,这显然是错误的,因为你需要前端才能登录。
有没有办法使用回退策略但从中排除静态文件(例如以某种方式向其添加 AllowAnonymous)?还是我走错了路,应该以不同的方式解决这个问题?
编辑:直接访问静态文件 (https://localhost:5001/index.html) 有效,但是当我调用根 url (https:/ /localhost:5001) 和 MapFallbackToFile("index.html")
。如果我注释掉回退策略,一切正常。
这是我当前的 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();
要让 auth 只访问 razor 页面和控制器,而不理会其他文件,这应该可以实现:
services.AddRazorPages().AddMvcOptions(options =>
options.Filters.Add(new AuthorizeFilter("MyCustomPolicy"))
);
我目前正在开发一个应用程序,我在其中设置了授权回退策略以避免必须在每个控制器上单独设置策略。问题是你现在必须登录才能访问“wwwroot”(我的前端所在的位置)下的静态文件,这显然是错误的,因为你需要前端才能登录。
有没有办法使用回退策略但从中排除静态文件(例如以某种方式向其添加 AllowAnonymous)?还是我走错了路,应该以不同的方式解决这个问题?
编辑:直接访问静态文件 (https://localhost:5001/index.html) 有效,但是当我调用根 url (https:/ /localhost:5001) 和 MapFallbackToFile("index.html")
。如果我注释掉回退策略,一切正常。
这是我当前的 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();
要让 auth 只访问 razor 页面和控制器,而不理会其他文件,这应该可以实现:
services.AddRazorPages().AddMvcOptions(options =>
options.Filters.Add(new AuthorizeFilter("MyCustomPolicy"))
);