Защита веб-API с помощью Windows Server 2012 R2 ADFS 3.0 и Katana

Я хотел бы создать веб-приложение MVC, которое взаимодействует с приложением веб-API и использовать ADFS 3.0 (в Windows 2012 R2) для аутентификации.

Мне удалось настроить веб-приложение MVC для аутентификации с использованием ADFS. и настроил все, как показано в этой статье Витторио Берточчи

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

Теперь я использую последнюю предварительную версию AAL от Nuget

Теперь, после аутентификации с помощью ADFS из веб-приложения MVC, я пытаюсь вызвать webapi.

public async Task<String> CallSecuredAPI()
        {
            string authority = "https://fs.domain.com/adfs";
            string resourceURI = "https://{hostheader}/SecuredAPI";
            string clientID = "ExternalWebSite1";
            string clientReturnURI = "https://{hostheader}/ExternalSite";

            AuthenticationContext ac = new AuthenticationContext(authority, false);
            AuthenticationResult ar = ac.AcquireToken(resourceURI, clientID, new   Uri(clientReturnURI));

            string authHeader = ar.CreateAuthorizationHeader();
            var client = new HttpClient();
            HttpRequestMessage request =
                new HttpRequestMessage(HttpMethod.Get, "https://hostheader/SecuredAPI/api/Claims");
            request.Headers.TryAddWithoutValidation("Authorization", authHeader);
            HttpResponseMessage response = await client.SendAsync(request);
            string responseString = await response.Content.ReadAsStringAsync();
            return responseString;
        }

но я получаю эту ошибку, которая, по-моему, связана с тем, что клиент не является клиентом на основе пользовательского интерфейса или WPF, Windows App. Может кто-нибудь сообщить мне, делаю ли я что-то не так.

! [Ошибка при попытке получить код авторизации с использованием AAL][1]

Ошибка сервера в приложении /ExternalSite.

Отображение модального диалогового окна или формы, когда приложение не запущено в режиме UserInteractive, не является допустимой операцией. Укажите стиль ServiceNotification или DefaultDesktopOnly для отображения уведомления из приложения-службы.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.InvalidOperationException: отображение модального диалогового окна или формы, когда приложение не запущено в режиме UserInteractive, не является допустимой операцией. Укажите стиль ServiceNotification или DefaultDesktopOnly для отображения уведомления из приложения-службы.

Source Error: 


Line 43: 
Line 44:             AuthenticationContext ac = new AuthenticationContext(authority, false);
Line 45:             AuthenticationResult ar = ac.AcquireToken(resourceURI, clientID, new Uri(clientReturnURI));
Line 46:             
Line 47:             string authHeader = ar.CreateAuthorizationHeader();

Source File: c:\Users\balakrishna.takkalla\Documents\Visual Studio 2013\Projects\ExternalSite\ExternalSite\Controllers\HomeController.cs    Line: 45 

Stack Trace: 


[InvalidOperationException: Showing a modal dialog box or form when the application is not running in UserInteractive mode is not a valid operation. Specify the ServiceNotification or DefaultDesktopOnly style to display a notification from a service application.]
   System.Windows.Forms.Form.ShowDialog(IWin32Window owner) +5701502
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialog.ShowBrowser() +18
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialog.OnAuthenticate() +23
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.WindowsFormsWebAuthenticationDialogBase.AuthenticateAAD(Uri requestUri, Uri callbackUri) +284
   Microsoft.IdentityModel.Clients.ActiveDirectory.Internal.InteractiveWebUI.OnAuthenticate() +103
   Microsoft.IdentityModel.Clients.ActiveDirectory.OAuth2Request.SendAuthorizeRequest(Authenticator authenticator, String resource, Uri redirectUri, String clientId, String userId, PromptBehavior promptBehavior, String extraQueryParameters, IWebUI webUi, CallState callState) +363
   Microsoft.IdentityModel.Clients.ActiveDirectory.<>c__DisplayClass9b.<AcquireAuthorization>b__9a() +111
   System.Threading.Tasks.Task.Execute() +110

1 ответ

Решение

Если я правильно понял: вы хотите получить доступ к веб-API из кода приложения MVC. Эта топология возможна в Azure Active Directory сегодня, вы можете увидеть это в действии в примере https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet (я нахожусь в процессе обновления до последнего обновления ADAL, вы можете заглянуть в ветку RCUpdate, чтобы увидеть текущую работу).

Однако эта топология сегодня недостижима для ADFS WS2012 R2. Причина в том, что приложение MVC (и любой другой веб-сайт) является конфиденциальным клиентом, который OAuth2 обрабатывает иначе, чем общедоступный клиент (приложение WPF, которое вы использовали в качестве отправной точки, является общедоступным клиентом). В сценарии, на который вы нацелены, чтобы использовать ADAL для получения токена от конфиденциального клиента, вы должны использовать метод ADAL AcquireTokenByAuthorizationCode (см. Пример, который я упоминал). Однако ADFS WS2012 R2 не может обработать этот метод. Сегодня поддержка OAuth2 в ADFS WS2012 R2 ограничена только публичными клиентами.

Извините за плохие новости! В качестве меры предосторожности вы можете рассмотреть возможность объединения вашей ADFS с арендатором AAD: на этом этапе вы сможете делать то, что хотите, проходя аутентификацию пользователя ADFS, но получая токены от AAD (который поддерживает необходимый грант OAuth2). HTH V.

Другие вопросы по тегам