Прежде всего, когда вы работаете с C #, я бы рекомендовал вам использовать IdentityModel для взаимодействия с любым сервером авторизации OAuth2 или провайдером OpenId Connect.
Давайте начнем с определения клиента : клиент - это приложение, которому разрешено запрашивать токены доступа от имени пользователя. В вашем примере ваш сервер, на котором запущен указанный вами код, является клиентом.
Чтобы использовать конечную точку token
для запроса нового access_token
, клиент должен сначала подтвердить свою личность, предоставив client_id
и client_secret
(например, имя пользователя и пароль для клиентов) .
Существует два метода для предоставления учетных данных этого клиента, из IdentityServer4 документации о секретах :
Аутентификация с использованием общего секрета
Вы можете отправить клиентскую комбинацию идентификатор / секрет как часть тела POST:
POST /connect/token
client_id=client1& client_secret=secret& ...
.. или в качестве основного заголовка аутентификации:
POST /connect/token
Authorization: Basic xxxxx
В этом случае в ответе об ошибке говорится, что разрешен только один из этих методов, а именно Заголовок аутентификации
Таким образом, вместо того, чтобы передавать client_id и client_secret вдоль тела вашего запроса:
request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");
вам нужно объединить client_id и client_secret с двоеточием в качестве разделителя, например "MM01418: xxxxxxxxxxxxxxxx", и применить кодировку base64. Затем добавьте его в свой запрос в качестве заголовка формы Authorization: Basic TU0wMTQxODp4eHh4eHh4eHh4eHh4eHh4
. Вы можете сделать это в C #, используя следующий код:
var credentials = string.Format("{0}:{1}", clientId, clientSecret);
var headerValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials));
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", headerValue);
или вместо этого оставьте детали этого низкого уровня в библиотеке, такой как IdentityModel Nuget Docs , которая реализует правильные запросы для вас в зависимости от случая.