ADFS v4.0 и конечная точка / userinfo дают 405 - PullRequest
0 голосов
/ 26 февраля 2020

Интеграция более старого ASP. NET серверного приложения в ADFS для аутентификации, что означает, что мне практически все пришлось писать с нуля. все работает (/ authorize, / token) вплоть до вызова / userinfo.

Мой код, в двух словах -

HttpClient client = new HttpClient();

var req = new HttpRequestMessage {
    RequestUri = new Url("https://<server_ip>/adfs/oauth2/userinfo"),
    Method = HttpMethod.Get,
};
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
req.Headers.UserAgent.Clear();
req.Headers.UserAgent.Add(new ProductInfoHeaderValue("OldApp", "11.3.0"));
var result = await client.SendAsync(req);

В результате возникает ошибка HTTP 405 - Метод не разрешен , Выполняя поиск в Интернете, я вижу это как распространенную проблему, когда конечный "/" не включен в URL, но Я получаю тот же результат с конечным sla * sh.

После осмотра, есть много примеров, которые используют более новые библиотеки и такие, которые я не могу использовать, к сожалению. Никто не упоминает использование / userinfo, и я думаю, что проблема не обязательно в том, как я называю URL, а в конфигурации «группы приложений» в ADFS.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Хорошо - я обнаружил проблему и запишу ее здесь на случай, если другие столкнутся с тем же.

Хотя я не уверен, почему / userinfo дает 405 - URL, который я использовал, это неверно, несмотря на то, что он указан в папке «Конечные точки». В URL не должно быть никаких «oauth2». Правильный код (и URL):

var req = new HttpRequestMessage {
    RequestUri = new Url("https://<server_ip>/adfs/userinfo"),
    Method = HttpMethod.Get,
};
req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
req.Headers.UserAgent.Clear();
req.Headers.UserAgent.Add(new ProductInfoHeaderValue("OldApp", "11.3.0"));
var result = await client.SendAsync(req);

Также следует иметь в виду - это было указано в другом месте, но я надеюсь, что не так ясно, как здесь: /userinfo ТОЛЬКО даст вам Заявка NameIdentifier («sub»). (Насколько я могу видеть.) Независимо от того, в каком объеме вы его передаете. Вы получите всю свою информацию (которая обычно должна быть в вызове /userinfo) в параметре "id_token" от вашего вызова /token, закодированного как JWT.

1 голос
/ 26 февраля 2020

Лично меня заставили сделать то же самое, что и вы, единственным решением было загрузить ADAL библиотеку (вы найдете ссылку ниже) и отладка кода для повторного создания того же потока HTTP из ADAL .

Вы можете создать новый проект, чтобы интегрировать ADAL , для отладки или перехвата HTTP потока

Ссылка ADAL

...