Я работаю над веб-приложением на приборной панели, которое использует grant_type=client_credentials
для получения токенов на предъявителя для получения доступа к своим ресурсам.
Планируется, что контроллеры MVC будут выполнять вызовы API от имени клиентского браузера.
Ajax-запросы от браузера попадут на контроллеры MVC, а затем будут выполнены вызовы API. Затем результаты передаются клиенту в виде JSON и обрабатываются в реакции.
Клиент никогда не должен связываться напрямую с API и не должен входить в систему, чтобы увидеть панель инструментов.
Когда приложение загружается впервые, оно запрашивает у сервера токен, используя учетные данные клиента, хранящиеся в appsettings.json
. Я могу получить токен, но я не знаю, где хранить и получить к нему доступ по всему миру. Мне нужен глобальный доступ к этому токену, чтобы примерно через 20 минут я мог отправить refresh_token
запрос на сервер и использовать его во всех последующих вызовах API для получения данных.
Могу ли я сохранить его в HttpContext
и использовать оттуда?
В настоящее время я запрашиваю токен следующим образом:
public class TokensController : ControllerBase
{
public IConfiguration Configuration { get; }
public TokensController(IConfiguration configuration)
{
Configuration = configuration;
}
// Get Token
public static async Task<Token> GetToken(Uri authenticationUrl, Dictionary<string, string> authenticationCredentials)
{
HttpClient client = new HttpClient();
FormUrlEncodedContent content = new FormUrlEncodedContent(authenticationCredentials);
HttpResponseMessage response = await client.PostAsync(authenticationUrl, content);
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
string message = String.Format("POST failed. Received HTTP {0}", response.StatusCode);
throw new ApplicationException(message);
}
string responseString = await response.Content.ReadAsStringAsync();
Token token = JsonConvert.DeserializeObject<Token>(responseString);
return token;
}
public IActionResult GetAccessToken()
{
Dictionary<string, string> authenticationCredentials_np = Configuration.GetSection("SomeEnvironment:Credentials").GetChildren().Select(x => new KeyValuePair<string, string>(x.Key, x.Value)).ToDictionary(x => x.Key, x => x.Value);
Token token_np = GetToken(new Uri(Configuration["SomeEnvironment:URL"]), authenticationCredentials_np).Result;
return Ok(token_np);
}
}
Есть предложения / мысли?