[英]How can I secure Controllers in a Razor Class Library
I have developed some Admin functionality (EF logic, Controller, and Razor UI for Audit Logs actually) that I've packaged into a Razor Class Library (RCL) and created a NuGet package. 我希望 package 的用户可以使用此功能,但我希望允许他们控制访问安全性。 我通常会用授权属性装饰 Controller,例如:
[Area("MyAuditLogPackage")]
[Authorize(Roles = "Admin")]
public class AuditLogController : Controller
...
但我不想假设客户的安全策略和审计日志是敏感数据。
他们可以从我的那里得到他们自己的 controller,但原来的路线仍然在他们的默认区域映射中。
我怎样才能将这个完全控制权交给 package 客户端?
您可以要求使用您的代码的人创建在启动时定义的自定义安全策略,而不是按角色授权。 这将导致类似
[Area("MyAuditLogPackage")]
[Authorize(Policy= "AuditControllerPolicy")]
public class AuditLogController : Controller
...
该策略方法非常灵活,因此该策略可能要求用户具有管理员角色。 它还可能要求令牌中存在其他声明,包括自定义声明。 查看Asp.Net Core 中基于策略的授权。
这种方法为 NuGet package 的用户提供了完全的灵活性,但许多人可能会觉得它很麻烦。 您可能想先 canvas 几个以获得他们的意见。
您可以创建扩展方法来动态保护您的 Razor Class 库路由。
定义:
internal static class IEndpointConventionBuilderExtensions
{
public static TBuilder AddAuthorization<TBuilder>(this TBuilder builder, AuthorizeAttribute? metadata = null)
where TBuilder : IEndpointConventionBuilder
{
if(metadata != null)
{
builder.WithMetadata(metadata);
}
return builder;
}
}
用法:
app.MapControllerRoute(
name: "MasterData",
pattern: "{culture}/{area:exists}/{controller=Log}/{action=Index}/{dictionaryName?}/")
.AddAuthorization(new AuthorizeAttribute("MasterData"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.