Я разрабатываю веб-приложение ASP.Net Core, где мне нужно создать своего рода «прокси-сервер аутентификации» для другого (внешнего) веб-сервиса.Создание прокси для другого веб-api с ядром Asp.net
Что я имею в виду под аутентификационным прокси-сервером, так это то, что я получу запросы через определенный путь своего веб-приложения и должен будет проверить заголовки этих запросов для токена аутентификации, которые я выпустил ранее, а затем перенаправить все запросы с той же строкой/контентом запроса к внешнему веб-API, которое мое приложение будет аутентифицировать с помощью HTTP Basic auth.
Вот весь процесс в псевдокоде
- Клиент запрашивает маркер, сделав POST в уникальный URL, который я послал его раньше
- Мое приложение посылает ему уникальный маркер в ответ на это сообщение
- Клиент делает запрос GET к определенному URL моего приложения, скажем
/extapi
и добавляет аутентификации-маркер в заголовке HTTP - Мое приложение получает запрос, проверяет, что Auth-маркер присутствует и действует
- Мое приложение делает то же запрос на внешний веб-API и опознает запрос с использованием BASIC аутентификации
- Мое приложение получает результат из запроса и отправляет его обратно клиенту
Вот что у меня есть сейчас , Кажется, что он работает нормально, но мне интересно, действительно ли это так должно быть сделано или если нет более элегантного или лучшего решения? Может ли это решение создать проблемы в конечном итоге для масштабирования приложения?
[HttpGet]
public async Task GetStatement()
{
//TODO check for token presence and reject if issue
var queryString = Request.QueryString;
var response = await _httpClient.GetAsync(queryString.Value);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
[HttpPost]
public async Task PostStatement()
{
using (var streamContent = new StreamContent(Request.Body))
{
//TODO check for token presence and reject if issue
var response = await _httpClient.PostAsync(string.Empty, streamContent);
var content = await response.Content.ReadAsStringAsync();
Response.StatusCode = (int)response.StatusCode;
Response.ContentType = response.Content.Headers.ContentType?.ToString();
Response.ContentLength = response.Content.Headers.ContentLength;
await Response.WriteAsync(content);
}
}
_httpClient
будучи HttpClient
классом экземпляр где-то еще и быть синглтоном и с BaseAddress
из http://someexternalapp.com/api/
Кроме того, есть более простой подход для маркеров создания/маркеров проверки, чем делать это вручную?
IIS обратный прокси –
Но что делать, если вы не размещаете на IIS? Я мог бы пойти на хостинг с помощью Kestrel на образ Docker или что-то в этом роде. – Gimly
Вы можете использовать любой сервер в качестве обратного прокси. Поэтому разверните экспресс-приложение с обратным прокси или любым другим популярным веб-сервером с обратным прокси ... –