Wie übergebe ich einen imitierten Benutzer in einem Web-API-Aufruf von Console App mit Windows-Authentifizierung?

Ich habe eine Console App und ein Web API 2-Projekt, die beide auf demselben Server ausgeführt werden. Ich habe meine Console App so eingerichtet, dass sie mit HttpClient einen RESTful-Endpunkt in meiner Web-API aufruft, während ich mir als Domänenkonto ausweise.

            Console.WriteLine("Setting up impersonator.");
            using (new Impersonator(accountUsername, accountDomain, accountPwd))
            {
                Console.WriteLine("Impersonator set up.");

                HttpClientHandler handler = new HttpClientHandler();
                handler.UseDefaultCredentials = true;

                Console.WriteLine("Executing as: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);

                using (var client = new HttpClient(handler))
                {
                    client.BaseAddress = new Uri(serviceBaseUrl);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    HttpResponseMessage response = await client.GetAsync("api/resource/3/");
                    Console.WriteLine(response.ToString());
                    if (response.IsSuccessStatusCode)
                    {
                        result = await response.Content.ReadAsAsync<ResourceType>();
                    }
                }

                if (result != null)
                {
                    // Do something...
                }
            }

Ich glaube nicht, dass der tatsächliche Endpunkt für diese Frage relevant ist, da die HTTP-Anforderung es nie bis zu diesem Punkt schafft (auch ohne Berechtigungsattribut). Wenn ich die beiden Projekte lokal ausführe, ist die Konsolen-App beim Tätigen des Anrufs erfolgreich. Wenn ich es jedoch auf dem Server ausführe, erhält die Konsolen-App einen nicht autorisierten 401. Ich habe meiner Web-API-Pipeline eine Protokollierung hinzugefügt, um die HttpContext.Current.User-Informationen zu protokollieren.

    protected void Application_BeginRequest()
    {
        var currentContext = HttpContext.Current;
        ILogHelper _logger = new LogHelper("System");

        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest Is User Null? " + (currentContext.User == null? "YES":"NO"));

        if (currentContext.User != null)
        {
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User: " + currentContext.User.Identity.Name);
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "BeginRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
        }
    }

    protected void Application_AuthenticateRequest()
    {
        var currentContext = HttpContext.Current;
        ILogHelper _logger = new LogHelper("System");

        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO"));

        if (currentContext.User != null)
        {
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User: " + currentContext.User.Identity.Name);
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthenticateRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
        }
    }

    protected void Application_AuthorizeRequest()
    {
        var currentContext = HttpContext.Current;
        ILogHelper _logger = new LogHelper("System");

        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest System Principal Name: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
        _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest Is User Null? " + (currentContext.User == null ? "YES" : "NO"));

        if (currentContext.User != null)
        {
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User: " + currentContext.User.Identity.Name);
            _logger.LogLine(NLog.LogLevel.Info, LogHelper.Tier.Business, "AuthorizeRequest User Authenticated: " + currentContext.User.Identity.IsAuthenticated.ToString());
        }
    }

Bei der lokalen Ausführung wird der imitierte Benutzer bei 'AuthenticateRequest' und 'AuthorizeRequest' angemeldet. Wenn der Benutzer jedoch auf dem Server ausgeführt wird, ist er auf dem gesamten Weg durch die Pipeline null.

Ich habe die Windows-Authentifizierung und den Windows-Identitätswechsel in IIS aktiviert (alles andere ist deaktiviert). Ich arbeite seit über 40 Stunden daran und habe das Gefühl, keine Fortschritte gemacht zu haben. Jede Hilfe bei diesem Problem wäre riesig!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage