Смешанная авторизация (Windows NTLM и анонимная) в приложении собственной подписки не работает - «Авторизация отклонена для этого запроса» - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь разработать собственный веб-приложение OWIN. Все хорошо, пока я не попытался интегрировать проверку подлинности Windows (NTLM). Проверка подлинности Windows работает нормально, если активирована только встроенная проверка подлинности Windows. Но мне нужно, чтобы некоторые запросы оставались анонимными.

Я уже обнаружил, что должен включить оба метода аутентификации:

AuthenticationSchemes.IntegratedWindowsAuthentication | AuthenticationSchemes.Anonymous

Но в таком случае я получаю «Авторизация была отклонена для этого запроса». Протестировано с Chrome в качестве клиента (http://localhost:9009/api/test).

Пожалуйста, помогите.

Класс запуска OWIN:

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        // Enable Windows & Anonymous Authentification
        HttpListener listener = (HttpListener)appBuilder.Properties["System.Net.HttpListener"];
        listener.AuthenticationSchemes = 
                AuthenticationSchemes.IntegratedWindowsAuthentication | AuthenticationSchemes.Anonymous;

        HttpConfiguration config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}"
        );
        appBuilder.UseWebApi(config);
    }
}

Основная программа:

static void Main()
    {
        string baseAddress = "http://localhost:9009/";

        // Start OWIN host 
        using (WebApp.Start<Startup>(url: baseAddress))
        {
            Console.WriteLine("Server ready");
            Console.ReadLine();
        }
    }

Тестовый контроллер:

using System.Collections.Generic;
using System.Security.Principal;
using System.Web.Http;

namespace SelfhostNTAuth

{
public class TestController : ApiController
{
    [Authorize]
    public IEnumerable<string> Get()
    {
        WindowsPrincipal user = RequestContext.Principal as WindowsPrincipal;

        if (user == null)
        {
            return new string[] { "unauthorized"};
        }
        else
        {
            return new string[] { user.Identity.AuthenticationType, user.Identity.Name };
        }
    }
}
}

1 Ответ

0 голосов
/ 17 мая 2019

Для меня работало использование AuthenticationSchemeSelector для возврата схемы аутентификации на основе некоторых критериев.

// Specify the authentication delegate.
listener.AuthenticationSchemeSelectorDelegate = 
    new AuthenticationSchemeSelector (AuthenticationSchemeForClient);
static AuthenticationSchemes AuthenticationSchemeForClient(HttpListenerRequest request)
{
    Console.WriteLine("Client authentication protocol selection in progress...");
    // Do not authenticate local machine requests.
    if (request.RemoteEndPoint.Address.Equals (IPAddress.Loopback))
    {
        return AuthenticationSchemes.None;
    }
    else
    {
        return AuthenticationSchemes.IntegratedWindowsAuthentication;
    }
}
...