Как аутентифицировать приложение WPF с помощью AAD B2C, чтобы получить доступ к службе приложений Azure

#wpf #azure #authentication #azure-ad-b2c #azure-app-service-envrmnt

#wpf #лазурный #аутентификация #azure-ad-b2c #azure-приложение-сервис-среда

Вопрос:

На данный момент я совершенно застрял, пытаясь внедрить аутентификацию в проект, над которым я работаю. Конечная цель этого проекта — иметь два приложения WPF и веб-приложение, размещенные в Azure. Одно приложение WPF предназначено для администратора, другое — для персонала и, наконец, веб-приложение для клиентов. Каждое приложение будет подключено к одной службе приложений Azure для общей базы данных и должно иметь аутентификацию, чтобы разделить всех пользователей. Для аутентификации я планирую использовать Azure Active Directory B2C.

Я уже несколько дней изучаю и пытаюсь реализовать это в одном из приложений WPF, но, как я уже говорил, я совершенно застрял. Насколько я понимаю, единственный способ выполнить аутентификацию B2C для WPF — это использовать аутентификацию, управляемую клиентом. Следуя коду, показанному на учебных сайтах Azure, других сообщениях SO и репозиториях Azure Git, я разработал следующий код:

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
   authResult = await App.PublicClientApp.AcquireTokenAsync(App.ApiScopes,
       GetUserByPolicy(accounts, App.PolicySignUpSignIn), UIBehavior.SelectAccount, 
       string.Empty, null, App.Authority);
   Newtonsoft.Json.Linq.JObject payload = new Newtonsoft.Json.Linq.JObject();
   payload["access_token"] = authResult.AccessToken;
   MobileServiceClient msclient = new MobileServiceClient(App.AzureAppService);
   MobileServiceUser user = await msclient.LoginAsync(
        MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);
 

Все начинается отлично, и я могу отобразить свою политику входа. После входа в систему мне выдаются idToken и accessToken. После создания JObject и добавления к нему токена доступа я пытаюсь использовать его для входа в систему с помощью моего MobileServiceClient. Но именно здесь у меня возникают проблемы. Независимо от того, что я делаю, независимо от того, что я пытаюсь, я получаю только исключение с ошибкой 401, сообщающей мне, что я неавторизован. И это тот момент, на котором я застрял за последние несколько дней.

Очевидно, что я не делаю здесь ничего особенного, и я предполагаю, что многие люди делали это до меня, но я просто не могу пройти мимо этого момента и надеялся, что кто-нибудь сможет дать мне какое-то руководство. Я сбился с пути? Есть ли лучший способ, которым я мог бы это сделать? Любые предложения или советы будут с благодарностью приняты, поскольку я новичок в Azure.

Спасибо всем!

Обновить:

Вот как у меня есть мои настройки Azure:

На стороне службы приложений

 Client Id: "{Client Id of the AAD B2C App}"
Issuer URL: "login.microsoft.com{TennatName}.onmicrosoft.com/v2.0/.well-known/openid-configuration"
Allowed Token Audiences: "https://{App Service Name}.azurewebsites.net" (App Service URL)
 

На стороне B2C:

 Web and native client enabled
Web Reply URL: "https://{AppServiceName}.azurewebsites.net/.auth/login/add/callback"
Native App: I did not know what custom redirect URL to have so I have both
"{TennatName}.onmicrosoft.com://auth/" and 
"{AppServiceName}.azurewebsites.net/.auth/login/add/callback"
 

Обновление 2:

 My authority is login.microsoftonline.com/tfp{tenant}/{policy}/oauth2/v2.0/authorize
And my ApiScopes = { "https://{Tenant}/thisisatest/user_impersonation" };
 

Комментарии:

1. Привет, Джошуа. Как вы настроили Azure AD для мобильных приложений Azure? например, идентификатор клиента, URL-адрес отправителя и разрешенные аудитории токенов?

2. Да, у меня есть! В службе приложений я настроил его для аутентификации с помощью AD. Вот как я это настроил — Служба приложений: Идентификатор клиента: идентификатор приложения URL-адреса эмитента приложения B2C: login.microsoft.com {Имя тенната}.onmicrosoft.com/v2.0/.well-known/openid-configuration На стороне B2C: Веб-и собственный клиент с поддержкой веб-ответа URL: https: //{AppServiceName}.azurewebsites.net/.auth/login/add/callback Родное приложение: я не знал, что такое пользовательский редиректПоэтому у меня есть оба {TennatName}.onmicrosoft.com://auth/ и {AppServiceName} .azurewebsites.net/.auth/login/add/callback

3. Вау, этот комментарий не был отформатирован так, как я его вставил.

4. Итак, если я могу предположить, что Authority в клиентском приложении установлено значение https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/ , то URL-адрес отправителя в службе приложений должен ссылаться на те же метаданные, т. https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/v2.0/.well-known/openid-configuration Е..

5. @JoshuaStevens Вы должны использовать https://{your-tenant-name}.b2clogin.com/tfp /{ваше-имя-арендатора}.onmicrosoft.com /{your-policy-name} в качестве органа власти.

Ответ №1:

Если для полномочий клиента установлено значение https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/ , то URL-адрес отправителя в службе приложений должен ссылаться на метаданные для этого органа; т.е. https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/v2.0/.well-known/openid-configuration .