Получить экземпляр контроллера в AuthorizeAttribute Mvc Core Web Api

Я использовал приведенный ниже класс для управления запросом метода api и настройки некоторых свойств класса BaseController для общего использования в методах. это от Asp.Net Mvc Web Api

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class AuthUserAttribute : AuthorizeAttribute
{

    private string Action { get; set; }

    public AuthUserAttribute(string action)
    {
        this.Action = action;
    }

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        BaseController baseController = httpContext.ControllerContext.Controller as BaseController;
        baseController.someCommenProperty = someValue;
    }
}

Но когда я пытаюсь реализовать такую ​​же структуру в Asp.Net Mvc Core Api, я не могу добраться до экземпляра контроллера, который инициализирован. Есть ли способ получить этот экземпляр.

использование Microsoft.AspNetCore.Authorization;

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Primitives;
using System;
using System.Linq;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class AuthUserAttribute : AuthorizeAttribute, IAuthorizationFilter
{


    private string Action { get; set; }
    public AuthUserAttribute(string action)
    {
        this.Action = action;
    }



    public void OnAuthorization(AuthorizationFilterContext context)
    {
        // how to get controller instance from context
    }
}

2 ответа

Решение

Вы можете использовать context.ActionDescriptor получить информацию о типе на контроллере.
Объект контроллера может быть вообще не создан в момент проверки авторизации.
Вы можете дополнительно реализовать IActionFilter и использовать экземпляр контроллера в его

public void OnActionExecuting(ActionExecutingContext context)

а также

public void OnActionExecuted(ActionExecutingContext context)

Для тех, кто сегодня ищет решение с использованием .NET 6, вы можете получить доступ к экземпляру контроллера в фильтре типов, реализовав как Microsoft.AspNetCore.Mvc.Filters.IActionFilter, так и интерфейс типа фильтра (например, Microsoft.AspNetCore.Mvc.Filters.IExceptionFilter). В качестве рабочего примера рассмотрим следующее.

      [TypeFilter(typeof(ExceptionFilter))]
public class MyController : ControllerBase
{

}

public class ExceptionFilter : IExceptionFilter, IActionFilter
{
    private MyController? MyController { get; set; }

    public void OnActionExecuted(ActionExecutedContext context)
    {
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        this.MyController = (MyController)context.Controller;
    }

    public void OnException(ExceptionContext context)
    {
        // Do something using this.MyController
    }
}

Примечание. OnActionExecuting происходит до OnException.

Другие вопросы по тегам