Я разрабатываю веб-приложение ASP.Net Core, где мне нужно создать своего рода "прокси-сервер проверки подлинности" для другого (внешнего) веб-сервиса.
То, что я подразумеваю под прокси-сервером аутентификации, - это то, что я буду получать запросы по определенному пути моего веб-приложения и должен будет проверить заголовки этих запросов для токена аутентификации, которые я выпустил ранее, а затем перенаправить все запросы с той же строкой/контентом запроса к внешнему веб-API, которое мое приложение будет аутентифицироваться с помощью HTTP Basic auth.
Здесь весь процесс в псевдокоде
- Клиент запрашивает токен, создавая POST для уникального URL-адреса, который я отправил ранее.
- Мое приложение отправляет ему уникальный токен в ответ на этот POST
- Клиент делает запрос GET на определенный URL-адрес моего приложения, скажем
/extapi
и добавляет аутентификационный токен в HTTP-заголовке - Мое приложение получает запрос, проверяет наличие и действительный токен аутентификации
- Мое приложение выполняет тот же запрос к внешнему веб-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
of http://someexternalapp.com/api/
Кроме того, существует ли более простой подход для проверки маркера/маркера, чем его вручную?