C# 多个AuthorizationHandler与带有Switch/If语句的单个AuthorizationHandler

C# 多个AuthorizationHandler与带有Switch/If语句的单个AuthorizationHandler,c#,asp.net-core-2.2,asp.net-authorization,C#,Asp.net Core 2.2,Asp.net Authorization,我已经成功地实施了该计划。我相信我理解这个概念 但是,除非我遗漏了什么,否则相同的或基础评估不能在单个处理程序中完成吗?为什么不使用一个if语句来说明如果这个需求有这个属性,那么就这样做;或者,如果这些条件中的任何一个通过,则需求成功。甚至他们页面上的BuildingEntryRequirement示例似乎也可以通过单个处理程序完成: public class ExampleBuildingEntryHandler : AuthorizationHandler<BuildingEntryR

我已经成功地实施了该计划。我相信我理解这个概念

但是,除非我遗漏了什么,否则相同的基础评估不能在单个处理程序中完成吗?为什么不使用一个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;
    }
}
public类示例buildingentryhandler:AuthorizationHandler
{
受保护的覆盖任务HandleRequirementAsync(授权HandlerContext上下文,
建筑工程(需求要求)
{
if(context.User.HasClaim)(c=>c.Type==“TemporaryBadgeId”&&c.Issuer==”https://microsoftsecurity") ||
context.User.HasClaim(c=>c.Type==“BadgeId”&&c.Issuer==”https://microsoftsecurity"))
{
//我们还要检查标签上的有效期。
成功(要求);
}
//TODO:如果目标是的版本,请使用以下命令
//.NET Framework早于4.6:
//返回Task.FromResult(0);
返回Task.CompletedTask;
}
}

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

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

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

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

  • 完全基于cookie,通过复杂的JWT令牌
  • 基于数据库,检索用户数据并检查某些条件
  • 现在,确实可以在同一个处理程序中同时处理这两种情况,但它们并不能很好地混合


    因此,在这种情况下,框架链接多个处理程序的能力将非常方便,并允许更好地分离关注点。

    我认为这是有意义的。我的分析瘫痪在某种程度上是因为我不断返回到某个场景,在该场景中,我需要从数据库中检索一个对象,并且我将多个处理程序(以及多个数据库调用)解释为不必要的开销。这种情况可能更有意义,尽管我已经将一些数据库调用移到了claims transformation服务中,所以我应该向DB请求的断言现在位于claims主体中。不过,我仍然不确定哪种模式是最好的,我也没有看到太多的“最佳实践”。如果涉及到数据库,我只会实现一个充当缓存的支持类。您可以实现自定义类,在您选择的依赖项注入(或Microsoft默认注入)中将它们注册为单例,并让每个处理程序实例使用它们。通过这种方式,您可以对其进行优化,并将查询排除在授权处理程序之外。但这是另一个问题。