【发布时间】:2019-12-15 05:56:49
【问题描述】:
在 ASP.Net Core 3.0 Preview 7 中,我尝试编写如下代码:
public void Configure(IApplicationBuilder app) {
app.MapWhen(context =>
context.Request.Path.StartsWithSegments(
new PathString("/UnsecureLog")),
a => {
a.UseRouting();
a.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
);
app.UseAuthentication();
app.UseAuthorization();
app.MapWhen(context =>
context.Request.Path.StartsWithSegments(
new PathString("/SecureLog")),
a => {
a.UseRouting();
a.UseEndpoints(endpoints => {
endpoints.MapControllers()
.RequireAuthorization("MustBeReader");
});
}
);
}
我的目标是允许在中间件中处理某些控制器而无需身份验证,我的想法是 MapWhen() 是实现这一目标的方法。
我在点击/UnsecureLog 端点时看到了这个错误:
System.InvalidOperationException: Endpoint ... 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.
翻译:“您如何为您不想保护的端点实施安全功能”。
我的结论是,在 any MapWhen() 块处理控制器逻辑中对RequireAuthorization("MustBeReader") 的任何调用实际上都将应用于所有 MVC 控制器路由。 p>
我当前的解决方法是删除第二个 MapWhen() 代码块中的 .RequireAuthorization("MustBeReader") 调用,并将其作为属性 ([RequireAuthorization("MustBeReader")]) 重新应用到我希望保护的那些端点。这可以正常工作并产生所需的行为。
但这不是目标,是吗?
我更愿意用类似的策略管理整个控制器组,同时完全避免其他人的安全性,并在 Configure() 中处理所有这些。相反,我必须将所需的授权要求逐个应用于每个控制器。
我希望有一种更好的方法来实现路由,从而避免此处提到的问题。也许我做错了什么。
有什么想法吗?
【问题讨论】:
-
我也发现相反的情况也是如此......如果你调用 MapWhen() 两次并在其中的 ONE 中执行此操作
.WithMetadata(new AllowAnonymousAttribute())- 你猜怎么着?没有安全适用于任何一个。即使另一个人全面实施了大量政策。
标签: authorization middleware asp.net-core-3.0