Сценарий:
Мне нужно загрузить рабочие элементы из двух систем управления проектами (VSTS и Jira) через их REST API.У каждого из них свой механизм авторизации:
- VSTS: использование токена доступа, загружаемого из базы данных, в зависимости от команды / группы пользователей
- Jira: использование персонального токена, загружаемого из утверждений пользователя, варьируется пользователем
Основные классы и интерфейс:
public interface IProjectManagementClient
{
ProjectManagementType Type { get; }
Task<WorkItem> GetWorkItemAsync(ProjectManagement projectManagement, int id, CancellationToken token = default(CancellationToken));
Task<List<WorkItem>> GetAllWorkItemsAsync(ProjectManagement projectManagement, string term, int limit = 10, CancellationToken token = default(CancellationToken));
}
public enum ProjectManagementType
{
VSTS,
Jira
}
public class ProjectManagement
{
public int Id { get; set; }
public ProjectManagementType Type { get; set; }
public string BaseAddress { get; set; }
public string AccessToken { get; set; }
}
Настройка:
services.AddHttpClient<IProjectManagementClient, VstsClient>();
services.AddHttpClient<IProjectManagementClient, JiraClient>()
.AddHttpMessageHandler(provider => new BasicAuthHandler(provider.GetService<IHttpContextAccessor>(), CustomClaimTypes.TrackerToken));
Пример использования:
public TimesheetsController(IEnumerable<IProjectManagementClient> projectManagementClients)
{
_projectManagementClients = projectManagementClients;
}
public void DoWork()
{
foreach (var timesheet in _timesheets)
{
var projectManagementClient = _projectManagementClients.First(o => o.Type == timesheet.ProjectManagement.Type);
timesheet.WorkItem = timesheet.WorkItemId.HasValue
? await projectManagementClient.GetWorkItemAsync(timesheet.ProjectManagement, timesheet.WorkItemId.Value, token)
: null;
}
}
Проблемы:
Несмотря на то, что я только зарегистрировал BasicAuthHandler
на JiraClient
.Он был применен как к клиентам VSTS, так и к клиентам Jira.
Таким образом, он переопределил авторизацию VSTS, которая была установлена ранее в VstsClient
.
Оба работают нормально, если я только настраиваюсьи использовать только их одновременно.Пожалуйста, помогите.