Я работаю в ядре asp.net MVC. и я вызываю API с сертификатом, и он отлично работает в режиме почтальона и разработки, но когда я публикую в IIS, я получаю ошибку. (Почтальон, разработка и IIS находятся на одном сервере)
public async Task<byte[]?> CallApiAsync(string signRequestId)
{
string ServicePath = @"D:\Service\aa.pfx";
X509Certificate2 certificate = new(ServicePath, "******");
// Add the certificate to HttpClientHandler
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(certificate);
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
// Create HttpClient with HttpClientHandler
var httpClientWithCert = new HttpClient(handler);
// Set additional headers
httpClientWithCert.DefaultRequestHeaders.Add("Language", "EN");
httpClientWithCert.DefaultRequestHeaders.Add("Authorization", "ApiKey");
// Define the base URL and parameter
var baseUrl = "https://url/view";
// Construct the URL with the parameter
var fullUrl = $"{baseUrl}?signRequestId = {Uri.EscapeDataString(signRequestId)}";
// Modify the request to GET
var request = new HttpRequestMessage(HttpMethod.Get, fullUrl);
// Send the GET request
var response = await httpClientWithCert.SendAsync(request);
var contentType = response.Content.Headers.ContentType?.MediaType;
// Process the response as needed
if (response.IsSuccessStatusCode && contentType == "multipart/form-data")
{
byte[] pdfBytes = await response.Content.ReadAsByteArrayAsync();
return pdfBytes;
}
else
{
return null;
}
}
и я получаю эту ошибку:
При обработке запроса произошло необработанное исключение. Win32Exception: учетные данные, предоставленные в пакете, не были признанный System.Net.SSPIWrapper.AcquireCredentialsHandle(ISSPIInterface secModule, пакет строк, намерение CredentialUse, SCHANNEL_CRED* scc)
AuthenticationException: аутентификация не удалась, см. внутреннее исключение. System.Net.Security.SslStreamPal.AcquireCredentialsHandle(SslAuthenticationOptions sslAuthenticationOptions, bool newCredentialsRequested)
HttpRequestException: не удалось установить SSL-соединение, см. внутреннее исключение. System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, запрос HttpRequestMessage, bool async, поток потока, Токен отмены (Token отмены)
Я пытаюсь дать разрешение папке и получаю ту же ошибку.
Разница заключается в личности пользователя, запускающего процесс.
Когда это работает, код выполняется от имени вашего пользователя.
Когда он не работает, он работает от имени пула приложений IIS.
Внутренне закрытый ключ размещается в памяти или во временном хранилище сертификатов на диске, которое находится в профиле пользователя вошедшего в систему сеанса. По умолчанию профиль для ApplicationPoolIdentity не загружается.
Вы можете попробовать изменить идентификатор пула приложений на Сетевую службу.
Спасибо, Шираз Бхайджи, я хочу знать причину, по которой возникла эта проблема.
Ключ хранится в профиле. Для этого профиль должен быть загружен. По умолчанию профиль для ApplicationPoolIdentity не загружается.
большое спасибо, все сработало идеально