Аутентификация в Azure AD (auth 2.0) WebAPI из приложения WPF-desktop на. NET Core - PullRequest
0 голосов
/ 23 апреля 2020

Мы создаем настольное приложение с использованием WPF. NET Core 3.1.

Я пытаюсь подключиться к веб-API с помощью Azure AD Authenticaton, следуя, например, этому руководству . Тем не менее, пример проекта (который работает нормально) написан на WPF. NET Framework.

Есть клиентская часть и серверная (web api) -часть. Поскольку клиент является настольным приложением, вы должны зарегистрировать api-часть в (Azure -> AD -> регистрации приложений ...) с URL-адресом ответа "https://login.microsoftonline.com/common/oauth2/nativeclient"

Я инициализирую свой PublicClientApplicationBuilder с

var app = PublicClientApplicationBuilder
        .Create(ClientIdPorterApplication)
        .WithAuthority(authority) 
        .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
        .Build();     

и при запуске app.AcquireTokenInteractive (...) получаю сообщение об ошибке:

Поддерживается только URI перенаправления петли, но https://login.microsoftonline.com/common/oauth2/nativeclient был найден. Настройте http://localhost или http://localhost: порт как при регистрации приложения, так и при создании объекта PublicClientApplication. Подробнее см. https://aka.ms/msal-net-os-browser

(этот адрес хорошо подходит для использования в примере, но, опять же, он написан на. NET FW)

поэтому просто ради интереса я изменил replyUrl (как при инициализации выше, так и при регистрации Azure Portal App) на "http://localhost: 1234 ". Пользователь получает в веб-браузере диалог выбора учетной записи, и после выбора учетной записи myname@mycompany.com отображается следующее сообщение:

Проверка подлинности завершена. Вы можете вернуться в приложение. Не стесняйтесь закрывать эту вкладку браузера.

Да !, верно? ... не совсем. В коде я все еще получаю исключение с сообщением об ошибке:

{"Проблема конфигурации препятствует аутентификации - проверьте сообщение об ошибке на сервере для деталей. Вы можете изменить конфигурацию в регистрации приложения портал. Подробнее см. https://aka.ms/msal-net-invalid-client Исходное исключение: AADSTS7000218: Тело запроса должно содержать следующий параметр: 'client_assertion' или 'client_secret'. \ r \ nTrace ID: 7b0f6384-64eb-422 c -a996-cadaa52f1f00 \ r \ nКорреляционный идентификатор: 0c579b5b-e706-4625-96da-fbf03e5a21f9 \ r \ nTimestamp: 2020-04-23 12: 14: 59Z "}

Есть какие-нибудь подсказки? Я где-то в безумии гуглял, что это невозможно на WPF в. net core-сценарии. Я уверен, что должно быть решение

РЕДАКТИРОВАТЬ: В моем моем последнем окне браузера (с сообщением "Аутентификация завершена ...", URL-адрес в окне URL имеет параметр qstring код = enter image description here

1 Ответ

0 голосов
/ 24 апреля 2020

Я могу только принять свой собственный ответ завтра, если я забуду, это ответ

Это то, что сработало для меня: просто для забавы-настройки путь к go:

var app = PublicClientApplicationBuilder
            .Create(ClientIdPorterApplication)                                              
            .WithAuthority(authority)
            .WithRedirectUri("http://localhost:1234")
            .Build();

(может быть любым портом, но он не должен использоваться другими). ...

result = await app.AcquireTokenInteractive(scopes) 
                                        .WithAuthority(authority) 
                                        .ExecuteAsync()
                                        .ConfigureAwait(false);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

msal прослушивает этот порт и волшебным образом получает токен из браузера

В azure есть два приложения регистрации, клиент (мой рабочий стол) приложение) и сервер (веб-API).

  • Сервер: Просто следуйте инструкциям в исходном вопросе
  • Клиент (плюс руководство): Для (Azure Portal-> AAD -> App reg-page-> Authentication :
    • "Относиться к приложению как к клиенту publi c." Должно быть "Да"
    • [Добавить платформу] -> Мобильный и рабочий стол, добавьте здесь свой URL ответа (мой - http://localhost: 1234 выше)
...