加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何创建自定义授权属性以检查Asp.Net Core中的角色和URL路径?

发布时间:2020-12-16 07:11:05 所属栏目:asp.Net 来源:网络整理
导读:我想创建一个自定义授权属性来检查角色和网址路径. 我已经找到了使用基于策略的授权在Asp.Net Core中执行此操作的方法,但我已经尝试实现它,但是我无法使用inclming url获取HttpContext. AuthorizationHandlerContext无法访问HttpContext. 如何通过url路径获
我想创建一个自定义授权属性来检查角色和网址路径.

我已经找到了使用基于策略的授权在Asp.Net Core中执行此操作的方法,但我已经尝试实现它,但是我无法使用inclming 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()
    {
    }
}

解决方法

政策方针是正确的.只有你错过的是,你可以在处理程序中使用依赖注入.

public class RoleUrlValidationHandler : AuthorizationHandler<RoleUrlValidationRequirement>
{
    private readonly IHttpContextAccessor contextAccessor;
    public class 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(‘/’)从中读取值,以便您可以轻松地从路径中读取参数值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读