C# 在ASP.NET MVC 6中将参数传递给需求/策略

C# 在ASP.NET MVC 6中将参数传递给需求/策略,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我试图在ASP.NET vNext中创建一个自定义授权属性,直到我在这篇文章中从@blowdart中找到了这个出色的答案: 表明授权要求现在是一条路要走。答案非常清楚,但没有说明如何将参数传递给此需求/策略 我要做的是移植一个MVC 5自定义授权属性,该属性具有以下签名: [Autorizacion(Requires = enumPermission.DeleteCustomer)] 因为我使用了一组非常定制的权限作为枚举/字符串镜像到后端/前端 由于这些功能还没有被记录下来,我觉得有点不知

我试图在ASP.NET vNext中创建一个自定义授权属性,直到我在这篇文章中从@blowdart中找到了这个出色的答案:

表明授权要求现在是一条路要走。答案非常清楚,但没有说明如何将参数传递给此需求/策略

我要做的是移植一个MVC 5自定义授权属性,该属性具有以下签名:

[Autorizacion(Requires = enumPermission.DeleteCustomer)]
因为我使用了一组非常定制的权限作为枚举/字符串镜像到后端/前端

由于这些功能还没有被记录下来,我觉得有点不知所措。。。有人能给我一些指导吗


提前感谢

事实上,@blowdart的帖子非常有洞察力,据我所知,要理解的关键是以下几点:

授权根据身份进行操作。身份是由 认证

因此,身份似乎是通过身份验证过程创建的

然后(如果您愿意),您可以启动授权过程。这意味着创建一个自定义的
授权要求
,该要求将查看这些身份并根据这些身份采取行动

简单地说,我相信这就是正在发生的事情:

  • 正如在blowdart的帖子中提到的,我们应该有一些 验证中间件,它恰好执行实际的 认证。一旦成功通过身份验证,您将获取任何 您希望从现在已通过身份验证的用户处获得的信息,并创建 已验证的
    ClaimsPrincipal

    例如,我们可以将 用户拥有的权限

  • 然后,当您创建
    授权要求时,您将查看
    
    ClaimsPrincipal
    ,从
    ClaimsPrincipal
    并根据需要采取适当的行动 你想要的商业规则

    假设您无法将权限集存储到
    ClaimsPrincipal
    出于某种原因,用户可以轻松地存储用户ID 从需求中,从
    ClaimsPrincipal
    ,调用数据库并获取权限集 然后对他们采取行动

  • 结论:

    因此,简而言之,我不认为您将内容传递给需求,我认为您可以从
    ClaimsPrincipal
    中获取这些内容

    在您的示例中,您可以创建一个需求,该需求读取
    ClaimsPrincipal
    ,并将任何值与
    Enum
    进行比较,然后执行该操作

    让我们知道你做了什么,以及它是否有效


    如果我对这一点的理解是错误的,那么无论如何,请随时纠正我,因为所有这些都是新的东西:-)

    我碰巧想出了一个可以满足我要求的解决方案,希望它也能帮助你

    在我的例子中,我需要将
    IHttpContextAccessor
    和EFCore的
    AppDbContext
    传递给我的类

    在我的
    Startup.cs
    中,我写了如下内容:

    services.AddAuthorization(options =>
    {
        options.AddPolicy("ThePolicy", policy => policy.Requirements.Add( new ThePolicyRequirement() ));
    });
    services.AddScoped<IAuthorizationHandler, ThePolicyAuthorizationHandler>();
    
    政策要求
    类别:

    public class ThePolicyAuthorizationHandler : AuthorizationHandler<ThePolicyRequirement>
    {
        readonly AppDbContext _appContext;
        readonly IHttpContextAccessor _contextAccessor;
    
        public ThePolicyAuthorizationHandler(AppDbContext c, IHttpContextAccessor ca)
        {
            _appContext = c;
            _contextAccessor = ca;
        }
    
        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, ThePolicyRequirement requirement)
        {
            var result = await requirement.isPass(_appContext, _contextAccessor, context);
            if (result)
                context.Succeed(requirement);
            else
                context.Fail(requirement);
        }
    }
    
    public class ThePolicyRequirement : IAuthorizationRequirement
    {
        AppDbContext _context;
        IHttpContextAccessor _contextAccessor;
        AuthorizationHandlerContext _authHandlerContext;
    
        public async Task<bool> isPass(AppDbContext context, IHttpContextAccessor contextAccessor, AuthorizationHandlerContext authorizationHandlerContext)
        {
            _context = context;
            _contextAccessor = contextAccessor;
            _authHandlerContext = authorizationHandlerContext;
    
            //logic here
    
            return result;
        }
    }
    
    public类策略要求:授权要求
    {
    AppDbContext _context;
    IHttpContextAccessor\U contextAccessor;
    授权HandlerContext_authHandlerContext;
    公共异步任务isPass(AppDbContext上下文、IHTTPCContextAccessor contextAccessor、AuthorizationHandlerContext AuthorizationHandlerContext)
    {
    _上下文=上下文;
    _contextAccessor=contextAccessor;
    _authHandlerContext=authorizationHandlerContext;
    //这里的逻辑
    返回结果;
    }
    }
    

    关键思想是使用
    policyAuthorizationHandler
    获取尽可能多的所需对象,并将其传递给
    policyRequirement
    ,以执行授权机制的逻辑

    是的,我正在把东西传递给需求。。。声明包含以base64字符串编码的位数组中标记的所有用户权限。与此相反,我需要检查是否授予了具体的权限来过滤给定api操作中的授权,这就是为什么我需要传递从映射到前一个数组的枚举中选择的具体权限。这样我就可以在不读取数据库的情况下超快速地检查权限,而且我对它们有intellisense,因为它们是枚举的一部分。这是目前在MVC 5中实现的,工作起来很有魅力。@Vi100我目前在一个ASP.NET MVC 5项目中工作,我想通过数据库表将用户角色动态分配给控制器。我理解您已经在ASP.NET MVC 5应用程序中实现了这一点,对吗?如果是,你愿意分享吗?如果没有,您能告诉我您用于开发解决方案的相关文档吗?非常感谢您的关心/帮助!