HttpContext.Current имеет значение null при использовании IAuthenticationFilter.

Я загружаю файлы, используя ng-file-upload, и у меня возникла какая-то ненормальная проблема, так как HttpContext.Current имеет значение null при использовании IAuthenticationFilter. Хотя все работает правильно, когда я комментирую фильтр аутентификации в WebApiConfig.

Контроллер для тестирования

    [HttpPost]
    public IHttpActionResult Upload()
    {
        var current = HttpContext.Current;
        if (current == null)
        {
            return Content(HttpStatusCode.BadRequest, Logger.Error("HttpContext.Current is null"));
        }            

        if (current.Request != null && current.Request.Files != null)
        {
            var file = current.Request.Files.Count > 0 ? current.Request.Files[0] : null;
            if (file != null)
            {
                file.SaveAs(@"C:\Temp\test.csv");
            }
        }
        return Content(HttpStatusCode.BadRequest, Logger.Error("Should not reach here"));
    }

IAuthenticationFilter

public class KeyAuthentication : Attribute, IAuthenticationFilter
{
    // we only want to apply our authentication filter once on a controller or action method so return false:
    public bool AllowMultiple
    {
        get { return false; }
    }

    // Authenticate the user by apiKey
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {            
        HttpRequestMessage request = context.Request;

        string apiKey = ExtractApiKey(request);
        bool IsValidCustomer = await ValidateKey(apiKey);
        if (IsValidCustomer)
        {
            var currentPrincipal = new GenericPrincipal(new GenericIdentity(apiKey), null);
            context.Principal = principal;                
        }
        else
        {
             context.ErrorResult = new ErrorMessageResult("Missing API Key");
        }
    }

    // We don't want to add challange as I am using keys authenticaiton
    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {  
        return Task.FromResult(0);
    }
}

Извлечь ключ API

public static string ExtractApiKey(HttpRequestMessage request)
{
    if (!request.Headers.TryGetValues("x-api-key", out IEnumerable<string> keys))
return string.Empty;

    return keys.First();
}

person Priyanka Rathee    schedule 21.10.2018    source источник
comment
Не используйте и не связывайте свой код с HttpContext.Current. Если это ApiController, вам нужно изменить используемый подход.   -  person Nkosi    schedule 21.10.2018
comment
Как файл выкладывается из клиента   -  person Nkosi    schedule 21.10.2018
comment
Не могли бы вы поделиться методом ExtractApiKey? Могу поспорить, что вы вытащили тело запроса в этом методе — это приведет к тому, что тело запроса станет null, когда оно перейдет к следующему обработчику в конвейере запросов.   -  person Svek    schedule 22.10.2018
comment
@Svek Нет, я просто извлекаю заголовок. Обновил код выше. Нашел кое-что интересное. Код работает нормально, если я удаляю асинхронность из метода AuthenticateAsync. Итак, кажется, что IIS меняет свой поток, который HttpContext потерял где-то посередине. Пока все есть, когда не используешь async/await.   -  person Priyanka Rathee    schedule 22.10.2018
comment
Собственно, где ваш await в методе? Обычно у вас будет такое утверждение, как IPrincipal principal = await AuthenticateAsync(userName, password, cancellationToken);   -  person Svek    schedule 22.10.2018
comment
Кроме того, как отмечалось ранее, вероятно, не следует использовать HttpContext.Current, см. здесь stackoverflow.com/a/38574489/3645638   -  person Svek    schedule 22.10.2018
comment
Возможный дубликат, см. stackoverflow.com/a/32338414/3973463.   -  person Alfredo A.    schedule 22.10.2018


Ответы (1)


Решение заключалось в том, чтобы включить «targetFramework = 4.5» в web.config, как прокомментировал @Alfredo, и более подробную информацию в https://stackoverflow.com/a/32338414/3973463

person Priyanka Rathee    schedule 07.11.2018