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' не может быть создан, поскольку текущий поток не находится в однопоточной квартире.

Редакция:

Действия по воспроизведению:

  1. Создать новый проект MVC с организационной аутентификацией. Используйте свой домен Windows Azure и учетную запись MSDN

  2. Добавить библиотеку аутентификации каталогов Actice через NuGet

  3. Добавьте действие со следующим кодом:

    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();
        }
    
  4. Запустите код и воспроизведите проблему (вызов метода 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/

Тот же автор, просто другая статья.

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