Asp.net core 如何从Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor读取值

Asp.net core 如何从Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor读取值,asp.net-core,Asp.net Core,正如问题所指出的,我正试图从中读取路由值,如id或其他参数 我做了这个基础课 public abstract class PermissionAttributeBase : Attribute, IAsyncAuthorizationFilter { /// <inheritdoc /> public async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext) {

正如问题所指出的,我正试图从中读取路由值,如id或其他参数

我做了这个基础课

public abstract class PermissionAttributeBase : Attribute, IAsyncAuthorizationFilter
{
    /// <inheritdoc />
    public async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext)
    {
        if (filterContext.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
        {
            if (controllerActionDescriptor.MethodInfo.IsDefined(typeof(AllowAnonymousAttribute)))
                return;

            if (!await IsAuthorizedAsync(new PermissionContext(filterContext, controllerActionDescriptor)))
                filterContext.Result = new ForbidResult();
        }
    }

    protected abstract Task<bool> IsAuthorizedAsync(PermissionContext permissionContext);
}

完全不返回值。

对于MVC,操作的参数值在ActionExecutingContext上可用,而不是在ControllerActionDescriptor上可用


请尝试
ActionExecutingContext.ActionArguments

对于MVC,action的参数值在ActionExecutingContext上可用,而不是在ControllerActionDescriptor上


请尝试
ActionExecutingContext。ActionArguments

Authz筛选器在模型绑定之前运行,因此在管道的这个阶段不会填充
ModelState
。@KirkLarkin感谢您的指针。是时候深入研究源代码了,我想我不知道您的确切需求,但是如果您只是想提取路由值,那么HttpContext.GetRoutedData可能很有用。为什么要从ControllerActionDescriptor中读取它?您可以读取
RouteData
filterContext.RouteData.Values[“id”?.ToString()
或查询字符串中的值,如
filterContext.HttpContext.Request.query[“id”].ToString()
@KirkLarkin谢谢。这可能确实有用,但我会看看是否可以以某种方式包含modelbinding。这可能会在模型绑定之前运行的endAuthz过滤器中提供一个有用的功能,因此在管道的这个阶段不会填充
ModelState
。@KirkLarkin感谢您的指针。是时候深入研究源代码了,我想我不知道您的确切需求,但是如果您只是想提取路由值,那么HttpContext.GetRoutedData可能很有用。为什么要从ControllerActionDescriptor中读取它?您可以读取
RouteData
filterContext.RouteData.Values[“id”?.ToString()
或查询字符串中的值,如
filterContext.HttpContext.Request.query[“id”].ToString()
@KirkLarkin谢谢。这可能确实有用,但我会看看是否可以以某种方式包含modelbinding。这最终可能会成为一个有用的特征
var read = permissionContext.FilterContext.ModelState.TryGetValue("id", out var val3);