Выбор поставщика проверки подлинности Microsoft Graph в зависимости от сценария

Поставщики проверки подлинности реализуют код, необходимый для получения маркера с помощью библиотеки проверки подлинности Майкрософт (MSAL), обрабатывают некоторые потенциальные ошибки в таких случаях, как добавочное согласие, пароли с истекшим сроком действия и условный доступ, а затем задают заголовок авторизации HTTP-запроса. В следующей таблице перечислены поставщики, которые соответствуют сценариям для различных типов приложений.

Сценарий Поток или предоставление Аудитория Поставщик
Одностраничное приложение Код авторизации с помощью PKCE Делегированный потребитель или организация Поставщик кода авторизации
Веб-приложение, которое вызывает веб-API
Authorization Code Делегированный потребитель или организация Поставщик кода авторизации
Учетные данные клиента Только приложение Поставщик учетных данных клиента
Веб-API, который вызывает веб-API
От имени Делегированный потребитель или организация Поставщик от имени
Учетные данные клиента Только приложение Поставщик учетных данных клиента
Классическое приложение, которое вызывает веб-API
Интерактивны Делегированный потребитель или организация Интерактивный поставщик
Встроенная оси Windows Делегированная организация Интегрированный поставщик Windows
Владелец ресурса Делегированная организация Поставщик имени пользователя и пароля
Код устройства Делегированная организация Поставщик кода устройства
Управляющая программа
Учетные данные клиента Только приложение Поставщик учетных данных клиента
Мобильное приложение, которое вызывает веб-API
Интерактивны Делегированный потребитель или организация Интерактивный поставщик

Примечание.

Следующие фрагменты кода были написаны с использованием последних версий соответствующих пакетов SDK. Если при работе с этими фрагментами кода возникают ошибки компилятора, убедитесь, что у вас установлены последние версии. Следующие библиотеки удостоверений Azure предоставляют используемые поставщики проверки подлинности:

  • Разработчикам .NET необходимо добавить пакет Azure.Identity .
  • Разработчикам TypeScript и JavaScript необходимо добавить библиотеку @azure и удостоверений .
  • Разработчикам Java и Android необходимо добавить библиотеку azure-identity .

Поставщик кода авторизации

Поток кода авторизации позволяет собственным и веб-приложениям безопасно получать маркеры в имени пользователя. Дополнительные сведения см. в статье Поток кода авторизации платформа удостоверений Майкрософт и OAuth 2.0.

var scopes = new[] { "User.Read" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";

// For authorization code flow, the user signs into the Microsoft
// identity platform, and the browser is redirected back to your app
// with an authorization code in the query parameters
var authorizationCode = "AUTH_CODE_FROM_REDIRECT";

// using Azure.Identity;
var options = new AuthorizationCodeCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://learn.microsoft.com/dotnet/api/azure.identity.authorizationcodecredential
var authCodeCredential = new AuthorizationCodeCredential(
    tenantId, clientId, clientSecret, authorizationCode, options);

var graphClient = new GraphServiceClient(authCodeCredential, scopes);

Поставщик учетных данных клиента

Поток учетных данных клиента позволяет приложениям-службам работать без взаимодействия с пользователем. Доступ основан на идентификаторе приложения. Дополнительные сведения см. в разделе платформа удостоверений Майкрософт и поток учетных данных клиента OAuth 2.0.

С использованием сертификата клиента

var scopes = new[] { "https://graph.microsoft.com/.default" };

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var clientCertificate = new X509Certificate2("MyCertificate.pfx");

// using Azure.Identity;
var options = new ClientCertificateCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://learn.microsoft.com/dotnet/api/azure.identity.clientcertificatecredential
var clientCertCredential = new ClientCertificateCredential(
    tenantId, clientId, clientCertificate, options);

var graphClient = new GraphServiceClient(clientCertCredential, scopes);

Использование секрета клиента

// The client credentials flow requires that you request the
// /.default scope, and pre-configure your permissions on the
// app registration in Azure. An administrator must grant consent
// to those permissions beforehand.
var scopes = new[] { "https://graph.microsoft.com/.default" };

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var tenantId = "YOUR_TENANT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";

// using Azure.Identity;
var options = new ClientSecretCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// https://learn.microsoft.com/dotnet/api/azure.identity.clientsecretcredential
var clientSecretCredential = new ClientSecretCredential(
    tenantId, clientId, clientSecret, options);

var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

Поставщик от имени

Поток on-behalf-of применим, когда приложение вызывает службу или веб-API, который вызывает API Graph Майкрософт. Дополнительные сведения см. в статье поток платформа удостоверений Майкрософт и OAuth 2.0 On-Behalf-Of

var scopes = new[] { "https://graph.microsoft.com/.default" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Values from app registration
var clientId = "YOUR_CLIENT_ID";
var clientSecret = "YOUR_CLIENT_SECRET";

// using Azure.Identity;
var options = new OnBehalfOfCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

// This is the incoming token to exchange using on-behalf-of flow
var oboToken = "JWT_TOKEN_TO_EXCHANGE";

var onBehalfOfCredential = new OnBehalfOfCredential(
    tenantId, clientId, clientSecret, oboToken, options);

var graphClient = new GraphServiceClient(onBehalfOfCredential, scopes);

Неявный поставщик

Поток неявной проверки подлинности не рекомендуется из-за его недостатков. Общедоступные клиенты, такие как собственные приложения и одностраничные приложения, теперь должны использовать поток кода авторизации с расширением PKCE. Ссылка.

Поставщик кода устройства

Поток кода устройства позволяет выполнять вход на устройства с другого устройства. Дополнительные сведения см. в разделе платформа удостоверений Майкрософт и поток кода устройства OAuth 2.0.

var scopes = new[] { "User.Read" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Value from app registration
var clientId = "YOUR_CLIENT_ID";

// using Azure.Identity;
var options = new DeviceCodeCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
    ClientId = clientId,
    TenantId = tenantId,
    // Callback function that receives the user prompt
    // Prompt contains the generated device code that user must
    // enter during the auth process in the browser
    DeviceCodeCallback = (code, cancellation) =>
    {
        Console.WriteLine(code.Message);
        return Task.FromResult(0);
    },
};

// https://learn.microsoft.com/dotnet/api/azure.identity.devicecodecredential
var deviceCodeCredential = new DeviceCodeCredential(options);

var graphClient = new GraphServiceClient(deviceCodeCredential, scopes);

Интегрированный поставщик Windows

Интегрированный поток Windows позволяет компьютерам Windows получать маркер доступа при автоматическом присоединении к домену. Дополнительные сведения см. в разделе Интегрированные проверка подлинности Windows.

Пакет Azure.Identity в настоящее время не поддерживает проверку подлинности, встроенную в Windows. Вместо этого создайте настраиваемый поставщик маркеров доступа с помощью MSAL.

Поставщик маркеров доступа

public class IntegratedWindowsTokenProvider : IAccessTokenProvider
{
    private readonly IPublicClientApplication publicClient;

    /// <summary>
    /// Initializes a new instance of the <see cref="IntegratedWindowsTokenProvider"/> class.
    /// </summary>
    /// <param name="clientId">The client ID from the app registration in Azure.</param>
    /// <param name="tenantId">The tenant ID from the app registration in Azure.</param>
    public IntegratedWindowsTokenProvider(string clientId, string tenantId)
    {
        // From MSAL (Microsoft.Identity.Client)
        publicClient = PublicClientApplicationBuilder
            .Create(clientId)
            .WithTenantId(tenantId)
            .Build();

        AllowedHostsValidator = new AllowedHostsValidator();
    }

    /// <summary>
    /// Gets an <see cref="AllowedHostsValidator"/> that validates if the
    /// target host of a request is allowed for authentication.
    /// </summary>
    public AllowedHostsValidator AllowedHostsValidator { get; }

    /// <inheritdoc/>
    public async Task<string> GetAuthorizationTokenAsync(
        Uri uri,
        Dictionary<string, object>? additionalAuthenticationContext = null,
        CancellationToken cancellationToken = default)
    {
        var scopes = new[] { "User.Read" };
        var result = await publicClient
            .AcquireTokenByIntegratedWindowsAuth(scopes)
            .ExecuteAsync(cancellationToken);
        return result.AccessToken;
    }
}

Создание клиента

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Value from app registration
var clientId = "YOUR_CLIENT_ID";

var authenticationProvider = new BaseBearerTokenAuthenticationProvider(
    new IntegratedWindowsTokenProvider(clientId, tenantId));

var graphClient = new GraphServiceClient(authenticationProvider);

return graphClient;

Интерактивный поставщик

Интерактивный поток используется мобильными приложениями (Xamarin и UWP) и классическими приложениями для вызова Microsoft Graph от имени пользователя. Дополнительные сведения см. в статье Получение маркеров в интерактивном режиме.

var scopes = new[] { "User.Read" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Value from app registration
var clientId = "YOUR_CLIENT_ID";

// using Azure.Identity;
var options = new InteractiveBrowserCredentialOptions
{
    TenantId = tenantId,
    ClientId = clientId,
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
    // MUST be http://localhost or http://localhost:PORT
    // See https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/System-Browser-on-.Net-Core
    RedirectUri = new Uri("http://localhost"),
};

// https://learn.microsoft.com/dotnet/api/azure.identity.interactivebrowsercredential
var interactiveCredential = new InteractiveBrowserCredential(options);

var graphClient = new GraphServiceClient(interactiveCredential, scopes);

Поставщик имени пользователя и пароля

Поставщик имени пользователя или пароля позволяет приложению входить в систему пользователя, используя его имя пользователя и пароль. Используйте этот поток только в том случае, если вы не можете использовать другие потоки OAuth. Дополнительные сведения см. в разделе платформа удостоверений Майкрософт и учетные данные владельца ресурса OAuth 2.0.

var scopes = new[] { "User.Read" };

// Multi-tenant apps can use "common",
// single-tenant apps must use the tenant ID from the Azure portal
var tenantId = "common";

// Value from app registration
var clientId = "YOUR_CLIENT_ID";

// using Azure.Identity;
var options = new UsernamePasswordCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
};

var userName = "adelev@contoso.com";
var password = "Password1!";

// https://learn.microsoft.com/dotnet/api/azure.identity.usernamepasswordcredential
var userNamePasswordCredential = new UsernamePasswordCredential(
    userName, password, tenantId, clientId, options);

var graphClient = new GraphServiceClient(userNamePasswordCredential, scopes);

Дальнейшие действия