我如何获取路由属性dotnet core 3?

问题描述 投票:0回答:1

我已将dotnet core 2.2升级到3.preview 7。所以在那之后,我无法获得自定义属性。2.2版中的context.Resource是AuthorizationFilterContext的类型,而3版中的Microsoft.AspNetCore.Http.Endpoint的类型。现在我无法从端点获取属性。

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace Gamma.Core.Security
{
    public abstract class AttributeAuthorizationHandler<TRequirement,     TAttribute>
    : AuthorizationHandler<TRequirement> where TRequirement
    : IAuthorizationRequirement where TAttribute : Attribute
    {
        Microsoft.AspNetCore.Http.IHttpContextAccessor _httpContextAccessor = null;
        public AttributeAuthorizationHandler(Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement)
        {
            var attributes = new List<TAttribute>();

            var action = (context.Resource as AuthorizationFilterContext)?.ActionDescriptor as ControllerActionDescriptor;
            if (context.Resource is Microsoft.AspNetCore.Http.Endpoint endpoint)
            {
                //endpoint.
            }

            if (action != null)
            {
                attributes.AddRange(GetAttributes(action.MethodInfo));
            }

            return HandleRequirementAsync(context, requirement, attributes);
        }

        protected abstract Task HandleRequirementAsync(AuthorizationHandlerContext context, TRequirement requirement, IEnumerable<TAttribute> attributes);

        private static IEnumerable<TAttribute> GetAttributes(MemberInfo memberInfo)
        {
            return memberInfo.GetCustomAttributes(typeof(TAttribute), false).Cast<TAttribute>();
        }
    }
}
.net-core attributes authorization .net-core-3.0 routedata
1个回答
0
投票

尚未找到答案,但这可能会有帮助

[https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-3.0有一节“在处理程序中访问MVC请求上下文”,但这是错误的。

但是在“反馈”下,他们的两个问题与最有前途的答案有关,说将以下代码添加到AuthorizationHandler中>]

这提供了对“ controllerActionDescriptor”的访问权限,但是如您所见,我已经查看了各种属性,但是没有一个给我当前的路由数据。

                var controllerActionDescriptor = routeEndpoint.Metadata
                    .OfType<ControllerActionDescriptor>()
                    .SingleOrDefault();

                if (controllerActionDescriptor != null)
                {
                    var a = controllerActionDescriptor.AttributeRouteInfo;
                    var p = controllerActionDescriptor.Parameters;
                    var ep = controllerActionDescriptor.EndpointMetadata;
                    var r = controllerActionDescriptor.RouteValues;
                }
© www.soinside.com 2019 - 2024. All rights reserved.