如何创建自定义授权属性以检查 Asp.Net 核心中的角色和 url 路径?
How create custom authorization attribute for checking a role and url path in Asp.Net Core?
我想创建一个自定义授权属性来检查角色和 url 路径。
我已经在 Asp.Net Core 中使用基于策略的授权找到了实现它的方法,但我已经尝试实现它,但是我无法通过传入 url.
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('/')
从中读取值,这样您就可以轻松地从路由中读取参数值。
这样试试:
((DefaultHttpContext)context.Resource).Request.Path.Value
我想创建一个自定义授权属性来检查角色和 url 路径。
我已经在 Asp.Net Core 中使用基于策略的授权找到了实现它的方法,但我已经尝试实现它,但是我无法通过传入 url.
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('/')
从中读取值,这样您就可以轻松地从路由中读取参数值。
这样试试:
((DefaultHttpContext)context.Resource).Request.Path.Value