Я пытаюсь создать httpclient на стороне Blazor Server, который бы создавал наименьшее количество усилий по настройке каждый раз, когда я вызываю мой webapi.
По сути, я хотел бы добиться следующего:
- Именованный HTTPClient Я могу автоматически вызывать, когда я вызываю функцию в моем webapi.
- Webapi требует токен на предъявителя, который я получаю, вызывая AcquireTokenSilent
- Было бы замечательно, если бы мне не приходилось указывать httpclient при вызове API
- . Webapi был добавлен в качестве ссылки на службу, поэтому естьКлассы скаффолдов, созданные в пространстве имен myapp.server.api
Для начала я создал при запуске следующее:
services.AddHttpClient<myapp.server.api.swaggerClient>(c =>
{
c.BaseAddress = new Uri("https://api.myapp.com/");
AzureADB2COptions opt = new AzureADB2COptions();
Configuration.Bind("AzureAdB2C", opt);
IConfidentialClientApplication cca =
ConfidentialClientApplicationBuilder.Create(opt.ClientId)
.WithRedirectUri(opt.RedirectUri)
.WithClientSecret(opt.ClientSecret)
.WithB2CAuthority(opt.Authority)
.WithClientName("myWebapp")
.WithClientVersion("0.0.0.1")
.Build();
IHttpContextAccessor pp;
string signedInUserID = context.User.FindFirst(ClaimTypes.NameIdentifier).Value;
new MSALStaticCache(signedInUserID, pp.HttpContext).EnablePersistence(cca.UserTokenCache);
var accounts = cca.GetAccountsAsync().Result;
AuthenticationResult result = null;
result = cca.AcquireTokenSilent(opt.ApiScopes.Split(' '), accounts.FirstOrDefault()).ExecuteAsync().Result;
c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
});
Я надеюсь, что смогу позвонить моемуapi в моих представлениях следующим образом:
myapp.server.api.swaggerClient t = new myapp.server.api.swaggerClient();
currentCount = t.WeatherForecastAsync().Result.FirstOrDefault().Summary;
вызов нового экземпляра swaggerclient требует от меня указания httpclient, поэтому я надеюсь, что внедрить httpclient, который я настраиваю на глобальном уровне для этого типа, может бытьвводится автоматически.
Части, с которыми мне нужна помощь:
- Учитывая, что я указал область моего httpclient для определенного типа, будет ли он вызывать Automatica? Если я вызову функцию в моем вебапи? (Кажется, не срабатывает при отладке)
- Чтобы получить токен на предъявителя, мне нужно получить текущий идентификатор пользователя, который находится в authstateprovider ... видя, что это в автозагрузке, получает его из DI дажевозможно?
- Есть ли простой способ добавить httpclient в конструктор моих классов webapi? смогу ли я получить httpclient в конструкторе, чтобы у меня был конструктор без параметров, не запрашивающий httpclient?