如何在Asp.NetCore中创建自定义授权属性以检查角色和url路径?

kcrjzv8t  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(170)

我想创建一个自定义授权属性来检查角色和url路径。
我已经找到了在ASP.NET内核中使用基于策略的授权的方法,但是我已经尝试实现它,但是我不能用传入的url获得HttpContext。
AuthorizationHandlerContext可能无法访问HttpContext。
我怎样才能用url路径得到当前的HttpContext?有没有可能这样做或者用其他方法?
我已经尝试了以下代码来创建自定义策略:

public class RoleUrlValidationHandler : AuthorizationHandler<RoleUrlValidationRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleUrlValidationRequirement requirement)
    {           
        var path = //Here I need get current url path for example - /api/posts/4545411
        var pathPart = path.Split('/');
        var clientId = pathPart[3];

        if (context.User.IsInRole(clientId))
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

我想创建以下内容:

[Authorize(Policy="RoleUrlValidation")] //Get ClientId from Url and check User's roles
public class PostsController : Controller
{
    public ActionResult Get()
    {
    }
}
plicqrtu

plicqrtu1#

策略方法是正确的。您唯一遗漏的一点是,您可以在处理程序中使用依赖注入。

public class RoleUrlValidationHandler : AuthorizationHandler<RoleUrlValidationRequirement>
{
    private readonly IHttpContextAccessor contextAccessor;

    public RoleUrlValidationHandler(IHttpContextAccessor contextAccessor)
    {
        this.contextAccessor = contextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleUrlValidationRequirement requirement)
    {
        var httpContext = contextAccessor.HttpContext;
        var path = httpContext.Request.Path;
        var pathPart = path.Split('/');
        var clientId = pathPart[3];

        if (context.User.IsInRole(clientId))
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

您可能还必须注册IHttpContextAccessor,因为它在默认情况下未注册。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

额外位:

考虑使用var routeData = httpContext.GetRouteData()而不是path.Split('/')来阅读值,以便您可以轻松地从路由读取参数值。

5kgi1eie

5kgi1eie2#

试着这样做:

((DefaultHttpContext)context.Resource).Request.Path.Value

相关问题