Защита веб-API с помощью Windows Server 2012 R2 ADFS 3.0 и Katana
Я хотел бы создать веб-приложение MVC, которое взаимодействует с приложением веб-API и использовать ADFS 3.0 (в Windows 2012 R2) для аутентификации.
Мне удалось настроить веб-приложение MVC для аутентификации с использованием ADFS. и настроил все, как показано в этой статье Витторио Берточчи
Теперь я использую последнюю предварительную версию 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.