System.Threading.ThreadStateException в ASP.NET MVC 5 при получении токена из WAAD
Я реализую следующий сценарий: ASP.NET MVC 5 получает доступ к OData WebAPI приложения с помощью аутентификации Azure Active Directory (как в этой статье: http://msdn.microsoft.com/en-us/magazine/dn463788.aspx).
Однако, когда я вызываю AuthenticationContext.AcquireToken, я получаю System.Threading.ThreadStateException, говорящее: элемент управления ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2' не может быть создан, поскольку текущий поток не находится в однопоточной квартире.
Редакция:
Действия по воспроизведению:
Создать новый проект MVC с организационной аутентификацией. Используйте свой домен Windows Azure и учетную запись MSDN
Добавить библиотеку аутентификации каталогов Actice через NuGet
Добавьте действие со следующим кодом:
public async Task<ActionResult> Index(){ AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/domain.onmicrosoft.com"); AuthenticationResult ar = ac.AcquireToken("https://domain.onmicrosoft.com/WindowsAzureADWebAPITest", "a4836f83-0f69-48ed-aa2b-88d0aed69652", new Uri("https://domain.onmicrosoft.com/myWebAPItestclient") ); // Call Web API string authHeader = ar.CreateAuthorizationHeader(); HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://server.com:44353/api/Values"); request.Headers.TryAddWithoutValidation("Authorization", authHeader); HttpResponseMessage response = await client.SendAsync(request); string responseString = await response.Content.ReadAsStringAsync(); return View(); }
Запустите код и воспроизведите проблему (вызов метода AcqureToken).
Пожалуйста, предложите исправить.
Спасибо!
1 ответ
Эта конкретная перегрузка AcquireToken() может использоваться только в собственном клиентском приложении, потому что он обрабатывает аутентификацию пользователя, открывая окно браузера для login.windows.net. Для этого требуется, чтобы приложение содержало элемент управления ActiveX браузера, и поэтому ему необходим поток STA.
Теперь в вашем примере код выполняется внутри IIS на сервере, где размещение элементов управления ActiveX просто невозможно.
Что вам действительно нужно, так это делегирование, которое описано здесь: http://www.cloudidentity.com/blog/2013/10/29/using-adals-acquiretokenby-authorizationcode-to-call-a-web-api-from-a-web-app/
Тот же автор, просто другая статья.