gpt4 book ai didi

c# - 在asp net core mvc中解析路由段

转载 作者:太空狗 更新时间:2023-10-30 01:31:35 25 4
gpt4 key购买 nike

我想在自定义属性中进行安全验证。一个很好的例子是,如果用户发出 GET 请求以检索具有给定 ID 的实体,我想在属性中拦截该请求,将其交给操作过滤器,然后确定用户是否有权访问它。我唯一的问题是如何检索实体 ID。我不能在属性声明中传递它,因为它被初始化一次而不是每个请求。相反,我想为我的自定义属性提供一个 url 模式,就像您为 HttpGet 或 HttpPost 提供的那样,并让它根据上下文的 url 参数进行解析以生成实体 ID。

这是我的属性:

public class RequireProjectAccessAttribute : TypeFilterAttribute
{
public string UrlPattern { get; set; }
public RequireProjectAccessAttribute(string urlPattern) : base(typeof(RequireProjectAccessFilter))
{
UrlPattern = urlPattern;
Arguments = new object[] { urlPattern };
}

private class RequireProjectAccessFilter : IAsyncActionFilter
{
private readonly ICurrentSession _currentSession;
private readonly string _urlPattern;

public RequireProjectAccessFilter(ICurrentSession currentSession, string urlPattern)
{
_currentSession = currentSession;
_urlPattern = urlPattern;
}

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var projectId = /* some magic to resolve _urlPattern against the current url parameter values */
if (/* user doesn't have access to project */)
{
context.Result = new UnauthorizedResult();
}
else
{
await next();
}
}
}
}

下面是我想如何使用它:

[Route("api/[controller]")]
public class ProjectsController : BaseController
{

public ProjectsController()
{
}

[RequireProjectAccess("{projectId}")]
[HttpGet("{projectId}")]
public JsonResult GetById(int projectId)
{
/* retrieve project */
}
}

最佳答案

你只需要提供应该包含值的路由键,然后使用扩展方法GetRouteValue(string key)HttpContext 对象上。

var projectId = context.HttpContext.GetRouteValue(_routeKey)?.ToString();

这意味着您的属性将如下所示:

public class RequireProjectAccessAttribute : TypeFilterAttribute
{
public string RouteKey { get; set; }
public RequireProjectAccessAttribute(string routeKey) : base(typeof(RequireProjectAccessFilter))
{
RouteKey = routeKey;
Arguments = new object[] { routeKey };
}

private class RequireProjectAccessFilter : IAsyncActionFilter
{
private readonly ICurrentSession _currentSession;
private readonly string _routeKey;

public RequireProjectAccessFilter(ICurrentSession currentSession, string routeKey)
{
_currentSession = currentSession;
_routeKey = routeKey;
}

public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var projectId = context.HttpContext.GetRouteValue(_routeKey)?.ToString();
if (/* user doesn't have access to project */)
{
context.Result = new UnauthorizedResult();
}
else
{
await next();
}
}
}
}

并用作此(注意我只是传递了路由键的名称):

[RequireProjectAccess("projectId")]
[HttpGet("{projectId}")]
public JsonResult GetById(int projectId)
{
/* retrieve project */
}

关于c# - 在asp net core mvc中解析路由段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40749656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com