Я разрабатываю веб-приложение 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
из http://someexternalapp.com/api/
Кроме того, есть ли более простой подход к созданию / проверке токена, чем выполнение этого вручную?