Подтвердить что ты не робот

Аутентификация с помощью Microsoft.Owin.Testing.TestServer для тестирования интеграции с памятью

Я только что перешел на использование OWIN\Katana для веб-проекта api. Он использует проверку подлинности Windows. Кажется, это работает, но большинство моих интеграционных тестов нарушены. Ранее они использовали только встроенную память HttpServer, но я изменил ее на использование Microsoft.Owin.Testing.TestServer. Я заменил что-то вроде этого в моей тестовой настройке:

        var config = new HttpConfiguration { IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always };
        config.EnableQuerySupport();
        Server = new HttpServer(config);
        MyConfigClass.Configure(config);
        WebApiConfig.Register(config);

с более простым:

TestServer = TestServer.Create<Startup>();

Но в то время как раньше я мог просто поставить следующее на "поддельную" аутентификацию на сервере в памяти:

Thread.CurrentPrincipal = new ClientRolePrincipal(new HttpListenerBasicIdentity(Username, Password));

Теперь это не работает. Я получаю следующее для всех запросов:

System.Exception : {"Message":"Authorization has been denied for this request."}

Как выполнить проверку подлинности на тестовом сервере OWIN с внутренней памятью или хотя бы обходить аутентификацию?

4b9b3361

Ответ 1

Мне удалось обойти это так, что я уверен, что это не оптимально, но мне придется делать это, пока я не найду лучшего решения, или один из вас, прекрасные люди, подскажет мне лучший способ сделать это:) Я сделал это следующим образом:

  • В моем классе Startup я добавил крюк CreateAuthFilter, который мы увидим позже, используется только в тестах интеграции:

    // Sample Startup class
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
    
            // Use CreateFilter Method to create Authorisation Filter -  if not null add it
            var authFilter = CreateAuthFilter();
            if(authFilter != null)
                config.Filters.Add(authFilter);
    
            // Other configuration and middleware...
        }
    
        public static Func<IFilter> CreateAuthFilter = () => null;
    }
    
  • Реализован фильтр авторизации, который будет использоваться только в тестах интеграции:

    public class TestAuthFilter : IAuthenticationFilter
    {
        static TestAuthFilter()
        {
            TestUserId = "TestDomain\\TestUser";
        }
    
        public bool AllowMultiple { get; private set; }
    
        public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
        {
            context.Principal = new ClientRolePrincipal(new HttpListenerBasicIdentity(TestUserId, "password")); ;
        }
    
        public static string TestUserId { get; set; }
    
        public async Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
        {
    
        }
    }
    
  • В коде SetUp для моих тестов интеграции я добавляю фильтр тестовой авторизации:

    Startup.CreateAuthFilter = () => new TestAuthFilter();
    var TestServer = TestServer.Create<Startup>();
    
  • При необходимости в определенных тестах я устанавливаю TestUserId на известное значение, а другие тесты работают, потому что присутствует фильтр Auth:

    TestAuthFilter.TestUserId = testUser.UserId;
    

Я делюсь этим здесь, потому что он помогает другим, но, пожалуйста, кто-нибудь скажет мне лучший способ! По крайней мере, я уверен, что есть лучший способ ввести мой тестовый фильтр, не включая код в Startup... Я просто не думал об этом.