Я проверил это поведение по предыдущим темам, поднятым здесь, но все они либо очень старые, либо не дают никакого точного ответа, поэтому я поднимаю свой собственный вопрос.
Приведенный ниже метод удаляет учетные данные из Дженкинс успешно, но код состояния, который возвращается из Jenkins API, составляет 403, поэтому мне пришлось применить обходной путь для справки с этим, но мне это не нравится ... это только временное решение.
Метод: < /p>
public async Task deleteCredential(string credentialId)
{
try
{
string jenkinsCrumb = await getJenkinsCrumb();
if (string.IsNullOrEmpty(jenkinsCrumb))
{
throw new Exception("Unable to retrieve Jenkins crumb.");
}
string jenkinsToken = await getJenkinsToken();
if (string.IsNullOrEmpty(jenkinsToken))
{
throw new Exception("Unable to retrieve Jenkins access token.");
}
using (var handler = new HttpClientHandler { AllowAutoRedirect=true, UseCookies = true, CookieContainer = new CookieContainer() })
using (var client = new HttpClient(handler))
{
string authString = $"{this.jenkinsUser}:{jenkinsToken}";
string base64Auth = Convert.ToBase64String(Encoding.ASCII.GetBytes(authString));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Auth);
string[] crumbParts = jenkinsCrumb.Split(':');
if (crumbParts.Length == 2)
{
client.DefaultRequestHeaders.Add(crumbParts[0], crumbParts[1]);
}
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
string encodedCredentialId = Uri.EscapeDataString(credentialId);
string deleteUrl = $"{this.jenkinsUrl}/credentials/store/system/domain/_/credential/{encodedCredentialId}/doDelete";
logger.LogInformation($"Deleting credential with ID {credentialId}...");
HttpResponseMessage response = await client.PostAsync(deleteUrl, null);
// Check if the initial request was "successful" (even if it's a 403)
if (response.StatusCode == HttpStatusCode.Forbidden)
{
//WORKAROUND: Checking if deletion was successful by performing a HEAD request
//Because Jenkins returns 403 even if the credential was deleted
//Still under analysis and investigation
HttpResponseMessage headResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, deleteUrl));
if (headResponse.IsSuccessStatusCode || headResponse.StatusCode == HttpStatusCode.NotFound)
{
logger.LogInformation($"Successfully deleted credential with ID {credentialId} (despite initial 403)");
return true;
}
else
{
logger.LogError($"Credential deletion failed to be reflected (HEAD request failed: {headResponse.StatusCode}).");
return false;
}
}
else if (response.IsSuccessStatusCode)
{
logger.LogInformation($"Successfully deleted credential with ID {credentialId}");
return true;
}
else
{
logger.LogError($"DELETE request failed. Status: {response.StatusCode}");
return false;
}
}
}
catch (Exception ex)
{
logger.LogError($"Error deleting credential with ID {credentialId}: {ex.Message}");
return false;
}
}
< /code>
Таким образом, метод аутентифицирует через токен Jenkins, и он также возвращает Crumb, и эта часть в порядке.
Но мне пришлось применить эту хромую логику, чтобы проверить, существует ли учетные данные через второй заголовок Запрос, чтобы определить, было ли удаление фактически успешным или нет (после первоначального запроса пост (удалить).
Я где -то читал, что проблема может возникнуть из -за Дженкинса, пытающегося перенаправить после удаления и не иметь возможности сохранить заголовки авторизации , но я не совсем уверен, что это дело.
Так кто -нибудь знает, что здесь такое Isssue и это ожидаемое поведение? < /p>
Подробнее здесь: https://stackoverflow.com/questions/794 ... arp-method
Jenkins Rest API возвращает 403 при удалении учетных данных с помощью метода C# ⇐ C#
Место общения программистов C#
1739351695
Anonymous
Я проверил это поведение по предыдущим темам, поднятым здесь, но все они либо очень старые, либо не дают никакого точного ответа, поэтому я поднимаю свой собственный вопрос.
Приведенный ниже метод удаляет учетные данные из Дженкинс успешно, но код состояния, который возвращается из Jenkins API, составляет 403, поэтому мне пришлось применить обходной путь для справки с этим, но мне это не нравится ... это только временное решение.
Метод: < /p>
public async Task deleteCredential(string credentialId)
{
try
{
string jenkinsCrumb = await getJenkinsCrumb();
if (string.IsNullOrEmpty(jenkinsCrumb))
{
throw new Exception("Unable to retrieve Jenkins crumb.");
}
string jenkinsToken = await getJenkinsToken();
if (string.IsNullOrEmpty(jenkinsToken))
{
throw new Exception("Unable to retrieve Jenkins access token.");
}
using (var handler = new HttpClientHandler { AllowAutoRedirect=true, UseCookies = true, CookieContainer = new CookieContainer() })
using (var client = new HttpClient(handler))
{
string authString = $"{this.jenkinsUser}:{jenkinsToken}";
string base64Auth = Convert.ToBase64String(Encoding.ASCII.GetBytes(authString));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Auth);
string[] crumbParts = jenkinsCrumb.Split(':');
if (crumbParts.Length == 2)
{
client.DefaultRequestHeaders.Add(crumbParts[0], crumbParts[1]);
}
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
string encodedCredentialId = Uri.EscapeDataString(credentialId);
string deleteUrl = $"{this.jenkinsUrl}/credentials/store/system/domain/_/credential/{encodedCredentialId}/doDelete";
logger.LogInformation($"Deleting credential with ID {credentialId}...");
HttpResponseMessage response = await client.PostAsync(deleteUrl, null);
// Check if the initial request was "successful" (even if it's a 403)
if (response.StatusCode == HttpStatusCode.Forbidden)
{
//WORKAROUND: Checking if deletion was successful by performing a HEAD request
//Because Jenkins returns 403 even if the credential was deleted
//Still under analysis and investigation
HttpResponseMessage headResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, deleteUrl));
if (headResponse.IsSuccessStatusCode || headResponse.StatusCode == HttpStatusCode.NotFound)
{
logger.LogInformation($"Successfully deleted credential with ID {credentialId} (despite initial 403)");
return true;
}
else
{
logger.LogError($"Credential deletion failed to be reflected (HEAD request failed: {headResponse.StatusCode}).");
return false;
}
}
else if (response.IsSuccessStatusCode)
{
logger.LogInformation($"Successfully deleted credential with ID {credentialId}");
return true;
}
else
{
logger.LogError($"DELETE request failed. Status: {response.StatusCode}");
return false;
}
}
}
catch (Exception ex)
{
logger.LogError($"Error deleting credential with ID {credentialId}: {ex.Message}");
return false;
}
}
< /code>
Таким образом, метод аутентифицирует через токен Jenkins, и он также возвращает Crumb, и эта часть в порядке.
Но мне пришлось применить эту хромую логику, чтобы проверить, существует ли учетные данные через второй заголовок Запрос, чтобы определить, было ли удаление фактически успешным или нет (после первоначального запроса пост (удалить).
Я где -то читал, что проблема может возникнуть из -за Дженкинса, пытающегося перенаправить после удаления и не иметь возможности сохранить заголовки авторизации , но я не совсем уверен, что это дело.
Так кто -нибудь знает, что здесь такое Isssue и это ожидаемое поведение? < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79431255/jenkins-rest-api-returns-403-when-deleting-credential-with-c-sharp-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия