Доступ к API GraphAccessing the Graph API

Выполните следующие действия, чтобы использовать API Graph из приложения Xamarin.Follow these steps to use the Graph API from within a Xamarin application:

  1. Регистрация в Azure Active Directory на windowsazure.com портала, затемRegistering with Azure Active Directory on the windowsazure.com portal, then
  2. Настройка служб.Configure services.

Шаг 3.Step 3. Добавление проверки подлинности Active Directory в приложениеAdding Active Directory authentication to an app

В приложении, добавьте ссылку на Azure библиотеку аутентификации Active Directory (ADAL в Azure) с помощью диспетчера пакетов NuGet в Visual Studio или Visual Studio для Mac.In your application, add a reference to Azure Active Directory Authentication Library (Azure ADAL) using the NuGet Package Manager in Visual Studio or Visual Studio for Mac. Обязательно выберите Показать пакеты предварительного выпуска для включения этого пакета, так как это на стадии предварительной версии.Make sure you select Show pre-release packages to include this package, as it is still in preview.

Важно!

Примечание. Azure ADAL 3.0 в настоящее время доступна в предварительной версии и может присутствовать критические изменения перед выпуском окончательной версии.Note: Azure ADAL 3.0 is currently a preview and there may be breaking changes before the final version is released.

В приложении теперь необходимо добавить следующие переменные уровня класса, которые требуются для потока проверки подлинности.In your application, you will now need to add the following class level variables that are required for the authentication flow.

//Client ID
public static string clientId = "25927d3c-.....-63f2304b90de";
public static string commonAuthority = "https://login.windows.net/common"
//Redirect URI
public static Uri returnUri = new Uri("http://xam-demo-redirect");
//Graph URI if you've given permission to Azure Active Directory
const string graphResourceUri = "https://graph.windows.net";
public static string graphApiVersion = "2013-11-08";
//AuthenticationResult will hold the result after authentication completes
AuthenticationResult authResult = null;

Следует заметить, вот commonAuthority.One thing to note here is commonAuthority. При конечную точку проверки подлинности common, ваше приложение станет мультитенантной, который означает, что любой пользователь, можно использовать имя входа с помощью учетных данных Active Directory.When the authentication endpoint is common, your app becomes multi-tenant, which means any user can use login with their Active Directory credentials. После проверки подлинности этот пользователь будет работать в контексте собственной службы Active Directory — т. е. они будут видеть сведения, связанные с его Active Directory.After authentication, that user will work on the context of their own Active Directory – i.e. they will see details related to his Active Directory.

Создать метод для получения токена доступаWrite method to acquire Access Token

Следующий код (для Android) будет запуск проверки подлинности и после завершения назначения результата в authResult.The following code (for Android) will start the authentication and upon completion assign the result in authResult. IOS и Windows Phone реализаций немного отличаться: второй параметр (Activity) отличается в iOS и отсутствует на Windows Phone.The iOS and Windows Phone implementations differ slightly: the second parameter (Activity) is different on iOS and absent on Windows Phone.

public static async Task<AuthenticationResult> GetAccessToken
            (string serviceResourceId, Activity activity)
{
    authContext = new AuthenticationContext(Authority);
    if (authContext.TokenCache.ReadItems().Count() > 0)
        authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
    var authResult = await authContext.AcquireTokenAsync(serviceResourceId, clientId, returnUri, new AuthorizationParameters(activity));
    return authResult;
}  

В приведенном выше коде AuthenticationContext отвечает за проверку подлинности с помощью commonAuthority.In the above code, the AuthenticationContext is responsible for the authentication with commonAuthority. Он имеет AcquireTokenAsync метод, который принимают параметры, как ресурс, который должен быть доступен, в этом случае graphResourceUri, clientId, и returnUri.It has an AcquireTokenAsync method, which take parameters as a resource which needs to be accessed, in this case graphResourceUri, clientId, and returnUri. Приложение будет отправлять returnUri после завершения проверки подлинности.The app will return to the returnUri when authentication completes. Этот код будет оставаться одинаковым для всех платформ, однако последний параметр AuthorizationParameters, будет отличаться на разных платформах и отвечает за регулирующих потока проверки подлинности.This code will remain the same for all platforms, however, the last parameter, AuthorizationParameters, will be different on different platforms and is responsible for governing the authentication flow.

В случае с Android или iOS, мы передаем this параметр AuthorizationParameters(this) для совместного использования контекста, тогда как в Windows он передается без какой-либо параметр как новый AuthorizationParameters().In the case of Android or iOS, we pass this parameter to AuthorizationParameters(this) to share the context, whereas in Windows it is passed without any parameter as new AuthorizationParameters().

Маркер продолжения для AndroidHandle continuation for Android

После завершения проверки подлинности поток должен вернуться в приложение.After authentication is complete, the flow should return to the app. В случае с Android, он обрабатывается в следующем примере кода, который следует добавить MainActivity.cs:In the case of Android it is handled by following code, which should be added to MainActivity.cs:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
  base.OnActivityResult(requestCode, resultCode, data);
  AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);

    
}

Маркер продолжения для Windows PhoneHandle continuation for Windows Phone

Для Windows Phone измените OnActivated метод в App.xaml.cs файл с помощью кода:For Windows Phone modify the OnActivated method in the App.xaml.cs file with the below code:

protected override void OnActivated(IActivatedEventArgs args)
{
#if WINDOWS_PHONE_APP
  if (args is IWebAuthenticationBrokerContinuationEventArgs)
  {
     WebAuthenticationBrokerContinuationHelper.SetWebAuthenticationBrokerContinuationEventArgs(args as IWebAuthenticationBrokerContinuationEventArgs);
  }
#endif
  base.OnActivated(args);
}

Теперь при запуске приложения, вы увидите диалоговое окно проверки подлинности.Now if you run the application, you should see an authentication dialog. После успешной проверки подлинности вам будет предложено ваши разрешения на доступ к ресурсам (в нашем случае Graph API):Upon successful authentication, it will ask your permissions to access the resources (in our case Graph API):

Если проверка подлинности завершена успешно и вы предоставили приложению доступ к ресурсам, вы должны получить AccessToken и RefreshToken поле со списком в authResult.If authentication is successful and you’ve authorized the app to access the resources, you should get an AccessToken and RefreshToken combo in authResult. Для дальнейшей вызовов API и авторизации с помощью Azure Active Directory в фоновом необходимы эти маркеры.These tokens are required for further API calls and for authorization with Azure Active Directory behind the scenes.

Например приведенный ниже код позволяет получить список пользователей из Active Directory.For example, the code below allows you to get a user list from Active Directory. Можно заменить URL-адрес API веб-API, защищенного Azure AD.You can replace the Web API URL with your Web API which is protected by Azure AD.

var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get,
    "https://graph.windows.net/tendulkar.onmicrosoft.com/users?api-version=2013-04-05");
request.Headers.Authorization =
  new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
var response = await client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();