Azure Active Directory - вызов API Microsoft Graph из проекта шаблона в VS2013

Вот краткое описание проблемы, с которой я столкнулся:

  • Я создал проект из VS2013, MVC с входом в учетную запись многопользовательской организации, использует AAD для аутентификации.
  • Шаблон проекта мне подходит, но мне нужно больше, мне нужно вызвать API графа
  • Проект образец на github, который вызывает API-интерфейс графа, также отлично работает. сам по себе, но нам нужно применить ту же концепцию в нашем проекте, который основан на шаблоне из VS2013
  • При попытке вызвать API графа из нашего решения аналогичным способом он не работает.

Вот краткое изложение агонии, которую я пережил за последние несколько дней.

В шаблоне проекта VS2013 для метода SignIn в контроллере учетной записи используется этот код:

 WsFederationConfiguration config = FederatedAuthentication.FederationConfiguration.WsFederationConfiguration;
        string callbackUrl = Url.Action("Index", "Home", routeValues: null, protocol: Request.Url.Scheme);
        SignInRequestMessage signInRequest = FederatedAuthentication.WSFederationAuthenticationModule.CreateSignInRequest(
            uniqueId: String.Empty,
            returnUrl: callbackUrl,
            rememberMeSet: false);
        signInRequest.SetParameter("wtrealm", IdentityConfig.Realm ?? config.Realm);
        return new RedirectResult(signInRequest.RequestUrl.ToString());

Пример проекта из github использует это:

HttpContext.GetOwinContext()
                .Authentication.Challenge(new AuthenticationProperties {RedirectUri = "/"},
                    OpenIdConnectAuthenticationDefaults.AuthenticationType);

Затем в классе запуска он фиксирует AuthorizationCodeReceived следующим образом:

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {

                ClientId = clientId,
                Authority = Authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    //
                    // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away.
                    //

                    AuthorizationCodeReceived = (context) =>
                    {
                        var code = context.Code;

Затем он сохраняет его в TokenCache, при вызове графического API он инициирует класс AuthenticationContext с таким кешем

                AuthenticationContext authContext = new AuthenticationContext(Startup.Authority,
                new NaiveSessionCache(userObjectID));
            ClientCredential credential = new ClientCredential(clientId, appKey);
            result = authContext.AcquireTokenSilent(graphResourceId, credential,
                new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

Я пытался сделать вот что:

 AuthenticationContext authContext = new AuthenticationContext(authority);
                ClientCredential credential = new ClientCredential(clientId, appKey);

результат = ожидание authContext.AcquireTokenAsync (graphResourceId, учетные данные);

Это возвращает более короткий токен с некоторой недостающей информацией.

Эту проблему можно легко воспроизвести, если вы создадите новый проект в VS2013 с использованием MVC и входа в учетную запись организации, а затем попытаетесь вызвать API-интерфейс графа.

Мне нужен способ вызова API-интерфейса графа с использованием проекта шаблона из VS2013.


person Ahmed Mansour    schedule 03.08.2016    source источник
comment
какая информация вам нужна из AD? Вам необходимо использовать этот токен для вызова API графа   -  person Thomas    schedule 03.08.2016
comment
Простой способ аутентификации с помощью AAD возвращает только логин пользователей. У одного из наших клиентов логин отличается от адреса электронной почты. Мне нужно получить их электронные письма. График, содержащий эту информацию, возвращает параметр mail.   -  person Ahmed Mansour    schedule 03.08.2016


Ответы (1)


Мы связались со службой поддержки Microsoft по поводу проблемы, и вот краткое изложение решения. Шаблон, созданный из VS2013, использует для аутентификации библиотеку WSFederation. Нет простого способа использовать это для вызова Graph API. Это было исправлено Microsoft в VS2015, где тот же шаблон использует библиотеку OpenID для аутентификации, а затем вы можете выполнять вызовы Graph API.

person Ahmed Mansour    schedule 30.08.2016