繁体   English   中英

如何保护 Razor Class 库中的控制器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM