【问题标题】:How to pass parameter of API route to attribute validation如何将 API 路由的参数传递给属性验证
【发布时间】:2019-10-16 00:26:52
【问题描述】:

我正在尝试使用 API 路由参数(将在多个 API 中使用)能够传递给验证属性。

这是属性

[AttributeUsage(AttributeTargets.All)]
public class AuthorizeSheetOwnerAttribute : Attribute
{
    private readonly ApplicationDbContext context;
    private readonly IHttpContextAccessor httpContextAccessor;

    public int characterSheetId { get; set; }

    public AuthorizeSheetOwnerAttribute(int characterSheetId, ApplicationDbContext context, IHttpContextAccessor httpContextAccessor)
    {
        this.characterSheetId = characterSheetId;
        this.context = context;
        this.httpContextAccessor = httpContextAccessor;
    }

    public async Task<bool> IsOwnerAsync()
    {
        var userId = httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
        if (context.CharacterSheetModel.FirstOrDefault(c => c.UserId == userId && c.Id == characterSheetId) == null) return false;
        return true;
    }
}

这就是暗示

[Route("api/{characterSheetId}/[controller]")]
[ApiController]
[AuthorizeSheetOwner(characterSheetId = "{characterSheetId}")]
public class WorldController : ControllerBase
{

属性应该采用从路由传入的 characterSheetId 来填充属性属性,但我不确定我该怎么做...我承认在属性处理方面有点天真

【问题讨论】:

    标签: c# asp.net-core routing attributes


    【解决方案1】:

    您可以自定义继承ActionFilterAttribute 的操作过滤器并将其用作控制器上的属性。直接读取OnActionExecuting事件中的路由数据如下:

    public class AuthorizeSheetOwnerAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var characterSheetId = filterContext.RouteData.Values["characterSheetId"].ToString() ;
    
            //write your logic
    
    
            if (false)
            {
                filterContext.Result = new BadRequestObjectResult("Custom error");
            } 
    
        }
    }
    

    用法:

    [Route("api/{characterSheetId}/[controller]")]
    [AuthorizeSheetOwner]
    [ApiController]
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2016-09-21
    • 2018-06-20
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多