我试图编写一个小型 API,其中每个端点默认情况下都应启用身份验证,因为我不想为每个端点重复相同的
[Authorize]
属性或 .RequiresAuthorization()
调用。
我做了所有通常的
.AddAuthentication()
,.AddAuthorization()
,.UseAuthentication()
,.UseAuthorization()
,但无论我如何参数化这些,我都无法获得未经授权的响应,除非我明确地添加该属性。
由于我有更多需要身份验证的端点,所以我更愿意用
[AllowAnonymous]
来装饰开放的端点
我什至不确定是否可以使用常规 Web API/MVC 来完成,但我当然找不到任何新的最小 API 方法。
您可以设置 FallBackPolicy 或 DefaultPolicy
services.AddAuthorization(options =>
{
options.FallbackPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
.RequireAuthenticatedUser()
.Build();
});
不仅仅是在公共 API 上使用AllowAnonymous
您可以将
AllowAnonymous
属性添加到最小 API 端点,如下所示:
app.MapGet("/hello", [AllowAnonymous] () => "Hello, World!");
这似乎可以使用
MapGroup
将默认值应用到无前缀的“根”路由组并从那里映射端点:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Create root route builder
// Authentication enforced by default. Opt-out via AllowAnonymous()
var routes = app.MapGroup(prefix: "").RequireAuthorization();
routes.MapGet("authed", () => "Authenticated by default");
routes.MapGet("anon", () => "Hello anon").AllowAnonymous();
(不确定指定空前缀是否有任何缺点)