Исключить контроллер из промежуточного программного обеспечения - PullRequest
0 голосов
/ 17 апреля 2019

Я написал промежуточное программное обеспечение, которое проверяет, включен ли токен авторизации в заголовок и на основании этого запроса, или возвращает ошибку, если токен отсутствует. Теперь он работает нормально для других контроллеров. Но что я должен сделать для контроллера входа / регистрации, который не требует заголовков авторизации. Как я могу настроить свое Middleware, чтобы игнорировать их.

Текущая реализация MiddleWare для проверки заголовков на токен авторизации.

public class AuthorizationHeaderValidator
{
    private readonly RequestDelegate _next;
    private readonly ILogger<AuthorizationHeaderValidator> _logger;
    public AuthorizationHeaderValidator(RequestDelegate next, ILogger<AuthorizationHeaderValidator> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        StringValues authorizationHeader;
        Console.WriteLine(context.Request.Path.Value);
       if (context.Request.Headers.TryGetValue("Authorization", out authorizationHeader))
        {
            await _next(context);
        }
       else
        {
            _logger.LogError("Request Failed: Authorization Header missing!!!");
            context.Response.StatusCode = 403;
            var failureResponse = new FailureResponseModel()
            {
                Result = false,
                ResultDetails = "Authorization header not present in request",
                Uri = context.Request.Path.ToUriComponent().ToString(),
                Timestamp = DateTime.Now.ToString("s", CultureInfo.InvariantCulture),
                Error = new Error()
                {
                    Code = 108,
                    Description = "Authorization header not present in request",
                    Resolve = "Send Request with authorization header to avoid this error."
                }
            };
            string responseString = JsonConvert.SerializeObject(failureResponse);
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync(responseString);
            return;

        }

    }
}

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

Это не полный ответ, а только указания. Пожалуйста, оставьте свой код, как только вы закончите эту задачу для следующих поколений.

Кажется, вам нужен фильтр, а не промежуточное ПО, поскольку промежуточное ПО не имеет доступа к данным маршрутизации. Создайте новый фильтр авторизации, унаследовав его от Attribute и реализовав IAuthorizationFilter или IAsyncAuthorizationFilter. Существует только один метод для реализации

public void OnAuthorization(AuthorizationFilterContext context)
{
}

или

public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
}

Украсьте контроллеры и / или действия, которые вы хотите исключить из этой логики, с помощью AllowAnonymousAttribute . Внутри вашего метода OnAuthorization проверьте, имеет ли текущее действие или контроллер AllowAnonymousAttribute и возвращается ли оно без установки Result для AuthorizationFilterContext. В противном случае выполните логику из вашего оригинального Middleware и установите свойство Result. Результат настройки приведет к короткому замыканию остальной части конвейера фильтра. Затем зарегистрируйте свой фильтр глобально:

services.AddMvc(options =>
{
    options.Filters.Add(new CustomAuthorizeFilter());
});
0 голосов
/ 18 апреля 2019

Я решил свою проблему, реализовав PipeLine

public class AuthorizationMiddlewarePipeline
{
    public void Configure(IApplicationBuilder applicationBuilder)
    {
        applicationBuilder.UseMiddleware<AuthorizationHeaderValidator>();
    }
}

И затем я использую его таким образом либо в области действия контроллера, либо в области действия метода

[MiddlewareFilter(typeof(AuthorizationMiddlewarePipeline))]
0 голосов
/ 17 апреля 2019

Не уверен, зачем вам нужно промежуточное ПО для проверки наличия заголовка авторизации.Сложно исключить контроллеры таким образом, поскольку все запросы проходят через это промежуточное ПО до того, как они попадут в конвейер MVC. Атрибут

[Authorize] сделает эту работу за вас, учитывая, что у вас встроена некоторая форма аутентификации.Если вам нужно исключить контроллеры, которые не требуют авторизации, вы можете просто добавить [AllowAnonymous] на уровне контроллера или на уровне метода действия.Смотрите приведенный ниже фрагмент кода из Документов Microsoft

[Authorize]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
    }

    public ActionResult Logout()
    {
    }
}

Если вам необходимо использовать промежуточное программное обеспечение, вы можете рассмотреть возможность его использования в качестве фильтра MVC, что означает, что он будеттрубопровод MVC.Для более подробной информации, пожалуйста, смотрите ссылку .Однако это все равно не решит проблему исключения контроллеров без добавления некоторой запутанной логики, которая может быть довольно сложной.

...