将参数传递给ASP.NET MVC 6中的需求/策略 [英] Pass parameters to a Requirement/Policy in ASP.NET MVC 6

查看:68
本文介绍了将参数传递给ASP.NET MVC 6中的需求/策略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I was trying to make a custom authorization attribute in ASP.NET vNext, until I found this excelent answer from @blowdart in this post:

https://stackoverflow.com/a/31465227/1756978

指示授权要求现在已成为要解决的问题.答案很明确,但没有指出如何将参数传递给此要求/策略.

indicating that Authorization requirements is now the way to go. The answer is very clarifying but doesn't indicates how to pass a parameter to this requirements / policies.

我要做的是移植具有此签名的MVC 5自定义授权属性:

What I'm trying to do is porting a MVC 5 custom authorization attribute which has this signature:

[Autorizacion(Requires = enumPermission.DeleteCustomer)]

因为我使用了一组非常定制的权限,这些权限在后端/前端中被镜像为枚举/字符串.

since I use a very customised set of permissions mirrored in the backend/frontend as enums/strings.

由于仍未记录此功能,我感到有些失落...有人可以提供指导吗?

As this features are still not documented I feel a little lost... Could anybody give guidance about?

预先感谢

推荐答案

我碰巧提出了一个可以满足我的要求的工作流程,希望它也能对您有所帮助.

I happen to comes up with a workround that can satisfy my requirement, hope it will help your too.

就我而言,我需要将IHttpContextAccessor和EFCore的AppDbContext传递给我的

In my case, I need to pass IHttpContextAccessor and EFCore's AppDbContext to my Requirement class.

在我的Startup.cs中,我这样写:

services.AddAuthorization(options =>
{
    options.AddPolicy("ThePolicy", policy => policy.Requirements.Add( new ThePolicyRequirement() ));
});
services.AddScoped<IAuthorizationHandler, ThePolicyAuthorizationHandler>();

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);
    }
}

ThePolicyRequirement类:

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;
    }
}

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

The key idea is using ThePolicyAuthorizationHandler to obtain as much as possible all needed objects, and pass it to ThePolicyRequirementto do the logic of the authorization mechanism.

这篇关于将参数传递给ASP.NET MVC 6中的需求/策略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆