Как получить пользователя Windows при отправке Angular-запроса на .Net Core 8?

Вопрос или проблема

Я слишком сильно застрял в этом, у меня есть приложение Angular с .Net Core 8, и всё, что мне нужно, это получить пользователя Windows из клиентского запроса, потому что мне нужно логировать, кто совершает определенные действия.

Я пробовал слишком много вещей, и ни одна из них не работает, я всегда получаю isAuthenticated = false, вот мой код, может кто-то помочь мне?

Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services.AddHttpContextAccessor();
...
app.UseAuthentication();
app.UseAuthorization();

launchingSettings.json

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:2390",
      "sslPort": 0
    }
  },
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5015",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
      }
    }
  }
}

proxy.config.js

const { env } = require('process');

const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` :
    env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'http://localhost:5015';

const PROXY_CONFIG = [
  {
    context: [
      "/api/MyApi",
    ],
    target,
    secure: false,
    onProxyRes: proxyRes => {
      const key = "www-authenticate";
      proxyRes.headers[key] = proxyRes.headers[key] &&
        proxyRes.headers[key].split(",");
    }
  }
]

module.exports = PROXY_CONFIG;

MyApiController.cs

public MyApiController(IHttpContextAccessor httpContextAccessor) 
{
    this.httpContextAccessor = httpContextAccessor;
}

[HttpGet]
public List<string> GetMyApi()
{
    //Здесь мне нужно получить пользователя Windows, и я всегда получаю isAuthenticated = false
    //...
}

Я также передаю withCredentials = true при вызове API

this.http.get<string>[]>('/api/MyApi', { withCredentials: true })

Вот информация при вызове API, я не уверен, проходит ли аутентификация, одна вещь, которую я заметил, это то, что сервер говорит: “Kestrel”, и я читал, что с этим не поддерживается аутентификация Windows, так ли это? Могла бы это быть проблема? Я также пробовал использовать IIS Express, но тогда я получаю ошибку 500.

введите описание изображения здесь

Дайте знать, если вам нужна дополнительная информация, я также буду признателен, если вы укажете мне правильное направление, кстати, я новичок в .Net Core.

Ответ или решение

Чтобы успешно получить информацию о текущем пользователе Windows в приложении на Angular, обращающемся к .NET Core 8, необходимо учесть несколько аспектов. Ваша проблема касается настройки аутентификации Windows, которая может быть сложной, особенно если вы используете Kestrel в качестве веб-сервера. Ниже приведены ключевые шаги, которые помогут вам разобраться с вашей проблемой.

1. Настройка проекта .NET Core

Убедитесь, что в вашем Program.cs файл правильно настроен для аутентификации Windows. Это включает в себя следующие настройки:

var builder = WebApplication.CreateBuilder(args);

// Добавление обязательных служб
builder.Services.AddControllers();
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
                .AddNegotiate();
builder.Services.AddAuthorization();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

Убедитесь, что вы используете Negotiate для аутентификации Windows. Этот метод позволяет использовать аутентификацию, основанную на Kerberos или NTLM.

2. Проверка конфигурации launchSettings.json

Ваш файл launchSettings.json настроен верно, но убедитесь, что вы запускаете проект с помощью IIS Express. Убедитесь, что в профиле IIS Express выставлены параметры как:

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false
}

Это нужно, чтобы анонимная аутентификация была отключена, и пользователи аутентифицировались через Windows.

3. Убедитесь, что Kestrel поддерживает Windows аутентификацию

Kestrel действительно не поддерживает аутентификацию Windows (в отличие от IIS), поэтому для разработки с аутентификацией Windows вам необходимо использовать месторождение IIS Express или полнофункциональный IIS. Это может быть причиной того, что вы получаете isAuthenticated = false.

4. Проверка конфигурации прокси в Angular

Ваш файл proxy.config.js выглядит правильно, но проверьте, что все заголовки передаются правильно. Также проверьте, указаны ли параметры withCredentials = true, когда вы отправляете запросы из вашего Angular-приложения:

this.http.get<string[]>('/api/MyApi', { withCredentials: true });

Это гарантирует, что браузер будет отправлять аутентификационные заголовки вместе с вашим запросом.

5. Доступ к имени пользователя в контроллере

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

[HttpGet]
public List<string> GetMyApi()
{
    var user = httpContextAccessor.HttpContext?.User;
    if (user?.Identity?.IsAuthenticated == true)
    {
        var windowsUser = user.Identity.Name; // Получение имени пользователя
        // Логика с использованием имени пользователя
    }
    // Обработка случая, когда пользователь не аутентифицирован
    return new List<string>();
}

6. Ошибки и отладка

Если вы получаете 500 ошибку во время использования IIS Express, проверьте журналы ошибок IIS и убедитесь, что ваша база данных и другие зависимости правильно настроены. Часто 500 ошибка возникает из-за проблем с конфигурацией или зависимостями, а не из-за самой аутентификации.

Заключение

Следуя вышеуказанным шагам, вы должны быть в состоянии получить текущего пользователя Windows в своем приложении Angular с API на .NET Core 8. Если вам нужна дальнейшая помощь, убедитесь, что у вас есть доступ к журналам ошибок и проверьте, нет ли дополнительных ошибок конфигурации в вашем проекте. Обязательно протестируйте настройки на локальном сервере, используя IIS Express, чтобы убедиться в правильности всех настроек аутентификации.

Если у вас есть дополнительные вопросы или нужна дальнейшая поддержка, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...