【问题标题】:Multiple AuthorizationHandlers vs. Single AuthorizationHandler with Switch/If Statements多个 AuthorizationHandler 与具有 Switch/If 语句的单个 AuthorizationHandler
【发布时间】:2019-12-03 22:52:04
【问题描述】:

我已经成功实现了policy-based authorization in ASP.NET Core 2.2。我相信我理解AuthorizationHandlers can perform requirement checks on an OR-basis 的概念。

但除非我遗漏了什么,否则不能在单个处理程序中完成相同的 OR 基础评估吗?为什么不直接使用 if 语句来说明此需求是否具有此属性,请执行此操作;或者如果这些条件中的任何一个通过,则要求成功。甚至他们页面上带有BuildingEntryRequirement 的示例似乎也可以通过单个处理程序完成:

public class ExampleBuildingEntryHandler : AuthorizationHandler<BuildingEntryRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
        BuildingEntryRequirement requirement)
    {
        if (context.User.HasClaim(c => c.Type == "TemporaryBadgeId" && c.Issuer == "https://microsoftsecurity") ||
            context.User.HasClaim(c => c.Type == "BadgeId" && c.Issuer == "https://microsoftsecurity"))
        {
            // We'd also check the expiration date on the sticker.
            context.Succeed(requirement);
        }

        //TODO: Use the following if targeting a version of
        //.NET Framework older than 4.6:
        //      return Task.FromResult(0);
        return Task.CompletedTask;
    }
}

我是否缺少需要使用多个处理程序的场景?

【问题讨论】:

    标签: c# asp.net-core-2.2 asp.net-authorization


    【解决方案1】:

    如果您要定义所有相关的实现,不,您可以使用单个处理程序。

    事实上,无论您有什么要求,您都可以开发一个完全适合您需求的自定义处理程序。

    如果您认为可以有完全不同的授权实现,那么这些示例会更有趣。喜欢:

    1. 完全基于 cookie,通过复杂的 JWT 令牌。
    2. 基于数据库,检索用户数据并检查某些情况。

    现在,您确实可以在同一个处理程序中同时执行这两种操作,但它们并不能很好地融合。

    因此,在这种情况下,框架链接多个处理程序的能力会很方便,并且可以更好地分离关注点。

    【讨论】:

    • 我想这确实有道理。我的分析瘫痪在某种程度上是因为我一直返回到某个场景,在该场景中我需要从数据库中检索一个对象,并且我将多个处理程序(以及因此多个数据库调用)解释为不必要的开销。这种情况可能更有意义,尽管我已经将我的一些数据库调用移到了声明转换服务中,所以我会要求数据库的断言现在位于声明主体中。不过,我仍然不确定哪种模式最好,而且我没有看到很多“最佳实践”。
    • 如果你有一个数据库,我会实现一个支持类作为缓存。您可以实现自定义类,在您选择的依赖注入(或 Microsoft 默认的)中将它们注册为单例,并让每个处理程序实例都使用它们。您可以通过这种方式优化它,并将查询排除在授权处理程序之外。但这是另一个问题。
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多