Аутентификация и авторизация

Совет

Это содержимое является фрагментом из электронной книги, шаблонов корпоративных приложений с помощью .NET MAUI, доступных в .NET Docs или в виде бесплатного скачиваемого PDF-файла, который можно прочитать в автономном режиме.

Корпоративные шаблоны приложений с помощью эскиза обложки электронной книги .NET MAUI .

Проверка подлинности — это процесс получения учетных данных идентификации, таких как имя и пароль от пользователя, и проверка этих учетных данных в отношении центра. Сущность, отправленная учетными данными, считается удостоверением, прошедшим проверку подлинности, если учетные данные действительны. После установления удостоверения процесс авторизации определяет, имеет ли это удостоверение доступ к указанному ресурсу.

Существует множество подходов к интеграции проверки подлинности и авторизации в приложение .NET MAUI , которое взаимодействует с веб-приложением ASP.NET, включая использование ASP.NET Core Identity, внешних поставщиков проверки подлинности, таких как Microsoft, Google, Facebook или Twitter, и ПО промежуточного слоя проверки подлинности. Приложение eShop с несколькими платформами выполняет проверку подлинности и авторизацию с помощью контейнерной микрослужбы удостоверений, использующего IdentityServer. Приложение запрашивает маркеры безопасности из IdentityServer для проверки подлинности пользователя или доступа к ресурсу. Чтобы IdentityServer выдавал маркеры от имени пользователя, пользователь должен войти в IdentityServer. Однако IdentityServer не предоставляет пользовательский интерфейс или базу данных для проверки подлинности. Поэтому в справочном приложении eShop ASP.NET Core Identity используется для этой цели.

Проверка подлинности

Проверка подлинности требуется, если приложению необходимо знать удостоверение текущего пользователя. ASP.NET основной механизм идентификации пользователей — это система членства ASP.NET Core Identity, которая хранит сведения о пользователе в хранилище данных, настроенном разработчиком. Как правило, это хранилище данных будет хранилище EntityFramework, хотя пользовательские хранилища или сторонние пакеты можно использовать для хранения сведений об удостоверениях в хранилище Azure, DocumentDB или других расположениях.

Для сценариев проверки подлинности, использующих хранилище данных локального пользователя и сохраняющие сведения об удостоверениях между запросами через файлы cookie (как обычно в веб-приложениях ASP.NET), ASP.NET Core Identity — это подходящее решение. Однако файлы cookie не всегда являются естественным средством сохранения и передачи данных. Например, веб-приложение ASP.NET Core, которое предоставляет конечные точки RESTful, к которым обращается приложение, обычно потребуется использовать проверку подлинности маркера носителя, так как файлы cookie нельзя использовать в этом сценарии. Однако маркеры носителя можно легко получить и включить в заголовок авторизации веб-запросов, сделанных из приложения.

Выдача маркеров носителя с помощью IdentityServer

IdentityServer — это платформа OpenID Connect с открытым кодом и OAuth 2.0 для ASP.NET Core, которая может использоваться для многих сценариев проверки подлинности и авторизации, включая выдачу маркеров безопасности для локальных пользователей ASP.NET Core Identity.

Примечание.

OpenID Connect и OAuth 2.0 очень похожи, хотя и имеют разные обязанности.

OpenID Connect — это уровень проверки подлинности поверх протокола OAuth 2.0. OAuth 2 — это протокол, позволяющий приложениям запрашивать маркеры доступа из службы маркеров безопасности и использовать их для взаимодействия с API. Это делегирование снижает сложность как клиентских приложений, так и API, так как проверка подлинности и авторизация могут быть централизованны.

OpenID Connect и OAuth 2.0 объединяют две основные проблемы безопасности для проверки подлинности и доступа к API, а IdentityServer — это реализация этих протоколов.

В приложениях, использующих прямую связь между клиентами и микрослужбами, например эталонное приложение eShop, выделенная микрослужба проверки подлинности, выступающая в качестве службы маркеров безопасности (STS), может использоваться для проверки подлинности пользователей, как показано на следующей схеме. Дополнительные сведения о прямой связи между клиентами и микрослужбами см. в разделе "Микрослужбы".

Проверка подлинности с помощью выделенной микрослужбы проверки подлинности.

Приложение eShop с несколькими платформами взаимодействует с микрослужбой удостоверений, которая использует IdentityServer для проверки подлинности и управления доступом для API. Таким образом, мультиплатформенное приложение запрашивает маркеры из IdentityServer либо для проверки подлинности пользователя, либо для доступа к ресурсу:

  • Проверка подлинности пользователей с помощью IdentityServer достигается многоплатформенным приложением, запрашивающим маркер удостоверения, представляющее результат процесса проверки подлинности . Как минимум, он содержит идентификатор пользователя и сведения о том, как и когда пользователь проходит проверку подлинности. Кроме того, он может включать дополнительные данные удостоверения.
  • Доступ к ресурсу с помощью IdentityServer достигается мультиплатформенным приложением, запрашивающим маркер доступа , который позволяет получить доступ к ресурсу API. Клиенты запрашивают маркеры доступа и пересылают их в API. Маркеры доступа содержат сведения о клиенте и пользователе, если они присутствуют. Затем API используют эти сведения для авторизации доступа к их данным.

Примечание.

Прежде чем он сможет успешно запросить маркеры, клиент должен быть зарегистрирован в IdentityServer. Дополнительные сведения о добавлении клиентов см. в разделе "Определение клиентов".

Добавление IdentityServer в веб-приложение

Чтобы веб-приложение ASP.NET Core использовало IdentityServer, его необходимо добавить в решение Visual Studio веб-приложения. Дополнительные сведения см. в разделе "Настройка и обзор " в документации по IdentityServer. После включения IdentityServer в решение Visual Studio веб-приложения его необходимо добавить в конвейер обработки HTTP-запросов для обслуживания запросов к конечным точкам OpenID Connect и OAuth 2.0. Это настраивается в Program.csIdentity.API, как показано в следующем примере кода:


...

app.UseIdentityServer();

Порядок имеет значение в конвейере обработки HTTP-запросов веб-приложения. Таким образом, IdentityServer необходимо добавить в конвейер перед платформой пользовательского интерфейса, реализующей экран входа.

Настройка IdentityServer

IdentityServer настраивается в Identity.API Program.cs проекта путем вызова AddIdentityServer метода, как показано в следующем примере кода из справочного приложения eShop:

builder.Services.AddIdentityServer(options =>
    {
        options.Authentication.CookieLifetime = TimeSpan.FromHours(2);
    
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;
    
        // TODO: Remove this line in production.
        options.KeyManagement.Enabled = false;
    })
    .AddInMemoryIdentityResources(Config.GetResources())
    .AddInMemoryApiScopes(Config.GetApiScopes())
    .AddInMemoryApiResources(Config.GetApis())
    .AddInMemoryClients(Config.GetClients(builder.Configuration))
    .AddAspNetIdentity<ApplicationUser>()
    // TODO: Not recommended for production - you need to store your key material somewhere secure
    .AddDeveloperSigningCredential();

После вызова services.AddIdentityServer метода вызываются дополнительные интерфейсы API fluent, чтобы настроить следующее:

  • Учетные данные, используемые для подписывания.
  • Ресурсы API и удостоверения, к которым пользователи могут запрашивать доступ.
  • Клиенты, которые будут подключаться к маркерам запроса.
  • ASP.NET Core Identity.

Совет

Динамическое загрузка конфигурации IdentityServer. API IdentityServer позволяют настроить IdentityServer из списка объектов конфигурации в памяти. В справочном приложении eShop эти коллекции в памяти жестко закодируются в приложении. Однако в рабочих сценариях их можно загружать динамически из файла конфигурации или из базы данных.

Сведения о настройке IdentityServer для использования ASP.NET Core Identity см. в документации по IdentityServer с помощью ASP.NET Core Identity .

Настройка ресурсов API

При настройке ресурсов AddInMemoryApiResources API метод ожидает коллекцию IEnumerable<ApiResource> . В следующем примере кода показан GetApis метод, предоставляющий эту коллекцию в справочном приложении eShop:

public static IEnumerable<ApiResource> GetApis()
{
    return new List<ApiResource>
    {
        new ApiScope("orders", "Orders Service"),
        new ApiScope("basket", "Basket Service"),
        new ApiScope("webhooks", "Webhooks registration Service"),
    };
}

Этот метод указывает, что IdentityServer должен защищать API заказов и корзины. Таким образом, маркеры доступа, управляемые IdentityServer, будут требоваться при вызове этих API. Дополнительные сведения о типе ApiResource см. в документации по ApiServer.

Настройка ресурсов удостоверений

При настройке ресурсов AddInMemoryIdentityResources удостоверений метод ожидает коллекцию IEnumerable<IdentityResource> . Ресурсы удостоверений — это данные, такие как идентификатор пользователя, имя или адрес электронной почты. Каждому ресурсу удостоверения присвоено уникальное имя, а произвольные типы утверждений могут быть назначены ему, которые будут включены в маркер удостоверения для пользователя. В следующем примере кода показан GetResources метод, предоставляющий эту коллекцию в справочном приложении eShop:

public static IEnumerable<IdentityResource> GetResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile()
    };
}

Спецификация OpenID Connect указывает некоторые стандартные ресурсы удостоверений. Минимальное требование заключается в том, что поддержка предоставляется для создания уникального идентификатора для пользователей. Это достигается путем предоставления IdentityResources.OpenId ресурса удостоверений.

Примечание.

Класс IdentityResources поддерживает все области, определенные в спецификации OpenID Connect (openid, email, profile, телефон и адрес).

IdentityServer также поддерживает определение ресурсов пользовательских удостоверений. Дополнительные сведения см. в разделе "Определение ресурсов пользовательских удостоверений" в документации по IdentityServer. Дополнительные сведения о типе IdentityResource см. в документации по IdentityServer.

Настройка клиентов

Клиенты — это приложения, которые могут запрашивать маркеры из IdentityServer. Как правило, для каждого клиента необходимо определить следующие параметры как минимум:

  • Уникальный идентификатор клиента.
  • Разрешенное взаимодействие со службой маркеров (известное как тип предоставления).
  • Расположение, в котором отправляются маркеры удостоверения и доступа (известный как универсальный код ресурса (URI перенаправления).
  • Список ресурсов, к которым клиент может получить доступ (известный как области).

При настройке клиентов AddInMemoryClients метод ожидает коллекцию IEnumerable<Client> . В следующем примере кода показана конфигурация мультиплатформенного приложения eShop в методе GetClients , который предоставляет эту коллекцию в справочном приложении eShop:

public static IEnumerable<Client> GetClients(Dictionary<string,string> clientsUrl)
{
    return new List<Client>
    {
        // Omitted for brevity
        new Client
        {
            ClientId = "maui",
            ClientName = "eShop MAUI OpenId Client",
            AllowedGrantTypes = GrantTypes.Code,                    
            //Used to retrieve the access token on the back channel.
            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },
            RedirectUris = { configuration["MauiCallback"] },
            RequireConsent = false,
            RequirePkce = true,
            PostLogoutRedirectUris = { $"{configuration["MauiCallback"]}/Account/Redirecting" },
            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                IdentityServerConstants.StandardScopes.OfflineAccess,
                "orders",
                "basket",
                "mobileshoppingagg",
                "webhooks"
            },
            //Allow requesting refresh tokens for long lived API access
            AllowOfflineAccess = true,
            AllowAccessTokensViaBrowser = true,
            AlwaysIncludeUserClaimsInIdToken = true,
            AccessTokenLifetime = 60 * 60 * 2, // 2 hours
            IdentityTokenLifetime = 60 * 60 * 2 // 2 hours
        }
    };
}

Эта конфигурация задает данные для следующих свойств:

Свойство Описание
ClientId Уникальный идентификатор клиента.
ClientName Отображаемое имя клиента, используемое для ведения журнала и экрана согласия.
AllowedGrantTypes Указывает, как клиент хочет взаимодействовать с IdentityServer. Дополнительные сведения см. в разделе "Настройка потока проверки подлинности".
ClientSecrets Указывает учетные данные секрета клиента, используемые при запросе маркеров из конечной точки маркера.
RedirectUris Указывает разрешенные URI, к которым возвращаются маркеры или коды авторизации.
RequireConsent Указывает, требуется ли экран согласия.
RequirePkce Указывает, должны ли клиенты, использующие код авторизации, отправлять ключ подтверждения.
PostLogoutRedirectUris Указывает разрешенные URI для перенаправления после выхода.
AllowedCorsOrigins Указывает источник клиента, чтобы IdentityServer могли разрешать вызовы между источниками.
AllowedScopes Указывает ресурсы, к к которые клиент имеет доступ. По умолчанию клиент не имеет доступа к каким-либо ресурсам.
AllowOfflineAccess Указывает, может ли клиент запрашивать маркеры обновления.
AllowAccessTokensViaBrowser Указывает, может ли клиент получать маркеры доступа из окна браузера.
AlwaysIncludeUserClaimsInIdToken Указывает, что утверждения пользователя всегда будут добавлены в маркер идентификатора. По умолчанию их необходимо извлечь с помощью конечной userinfo точки.
AccessTokenLifetime Указывает время существования маркера доступа в секундах.
IdentityTokenLifetime Указывает время существования маркера удостоверения в секундах.

Настройка потока проверки подлинности

Поток проверки подлинности между клиентом и IdentityServer можно настроить, указав типы грантов в свойстве Client.AllowedGrantTypes . Спецификации OpenID Connect и OAuth 2.0 определяют несколько потоков проверки подлинности, в том числе:

Поток проверки подлинности Описание
Неявный Этот поток оптимизирован для приложений на основе браузера и должен использоваться только для проверки подлинности пользователей, а также для запросов маркеров доступа и проверки подлинности. Все маркеры передаются через браузер, поэтому расширенные функции, такие как маркеры обновления, не допускаются.
Код авторизации Этот поток обеспечивает возможность получения маркеров на заднем канале, а не внешнего канала браузера, а также поддержки проверки подлинности клиента.
Гибридный трафик Этот поток представляет собой сочетание неявных и типов предоставления кода авторизации. Маркер удостоверения передается через канал браузера и содержит подписанный ответ протокола и другие артефакты, такие как код авторизации. После успешной проверки ответа обратный канал должен использоваться для получения маркера доступа и обновления.

Совет

Рассмотрите возможность использования потока гибридной проверки подлинности. Поток гибридной проверки подлинности устраняет ряд атак, которые применяются к каналу браузера, и это рекомендуемый поток для собственных приложений, которые хотят получить маркеры доступа (и, возможно, маркеры обновления).

Дополнительные сведения о потоках проверки подлинности см. в документации по IdentityServer.

Выполнение проверки подлинности

Чтобы IdentityServer выдавал маркеры от имени пользователя, пользователь должен войти в IdentityServer. Однако IdentityServer не предоставляет пользовательский интерфейс или базу данных для проверки подлинности. Поэтому в справочном приложении eShop ASP.NET Core Identity используется для этой цели.

Приложение eShop с несколькими платформами проходит проверку подлинности с помощью IdentityServer с помощью гибридного потока проверки подлинности, который показан на схеме ниже.

Общие сведения о процессе входа.

Запрос на вход выполняется <base endpoint>:5105/connect/authorize. После успешной проверки подлинности IdentityServer возвращает ответ проверки подлинности, содержащий код авторизации и маркер удостоверения. Код авторизации отправляется <base endpoint>:5105/connect/tokenв , в который отвечает маркеры доступа, удостоверения и обновления.

Приложение eShop с несколькими платформами выходит из IdentityServer, отправив запрос <base endpoint>:5105/connect/endsession на дополнительные параметры. После выхода IdentityServer отвечает, отправив URI после выхода обратно в мультиплатформенное приложение. На приведенной ниже схеме показан этот процесс.

Общие сведения о процессе выхода.

В мультиплатформенное приложение eShop обмен данными с IdentityServer выполняется классом IdentityService , который реализует IIdentityService интерфейс. Этот интерфейс указывает, что реализующий класс должен предоставлять SignInAsyncи SignOutAsyncGetUserInfoAsyncGetAuthTokenAsync методы.

Вход

Когда пользователь нажимает LOGIN кнопку на LoginViewней, SignInCommand выполняется в LoginViewModel классе, который, в свою очередь, выполняет SignInAsync метод. Этот метод показан в следующем примере кода:

[RelayCommand]
private async Task SignInAsync()
{
    await IsBusyFor(
        async () =>
        {
            var loginSuccess = await _appEnvironmentService.IdentityService.SignInAsync();

            if (loginSuccess)
            {
                await NavigationService.NavigateToAsync("//Main/Catalog");
            }
        });
}

Этот метод вызывает SignInAsync метод в классе, как показано в IdentityService следующем примере кода:

public async Task<bool> SignInAsync()
{
    var response = await GetClient().LoginAsync(new LoginRequest()).ConfigureAwait(false);

    if (response.IsError)
    {
        return false;
    }

    await _settingsService
        .SetUserTokenAsync(
            new UserToken
            {
                AccessToken = response.AccessToken,
                IdToken = response.IdentityToken,
                RefreshToken = response.RefreshToken,
                ExpiresAt = response.AccessTokenExpiration
            })
        .ConfigureAwait(false);

    return !response.IsError;
}

Использует IdentityService предоставленный OidcClientIdentityModel.OidcClient пакет NuGet. Этот клиент отображает веб-представление проверки подлинности пользователю в приложении и записывает результат проверки подлинности. Клиент подключается к URI конечной точки авторизации IdentityServer с необходимыми параметрами. Конечная точка авторизации находится через /connect/authorize порт 5105 базовой конечной точки, предоставляемой в качестве параметра пользователя. Дополнительные сведения о параметрах пользователя см. в разделе "Управление конфигурацией".

Примечание.

Область атаки мультиплатформенного приложения eShop уменьшается путем реализации расширения Proof Key for Code Exchange (PKCE) в OAuth. PKCE защищает код авторизации от использования, если он перехватывается. Это достигается клиентом, создающим секретный проверяющий объект, хэш которого передается в запросе авторизации, и который отображается без косой черты при активации кода авторизации. Дополнительные сведения о PKCE см . на веб-сайте Группы задач разработки Интернета в качестве ключа проверки подлинности для обмена кодом от общедоступных клиентов OAuth.

Страница входа, отображаемая WebView.

Если конечная точка маркера получает допустимые сведения о проверке подлинности, код авторизации и средство проверки секрета PKCE, он отвечает с помощью маркера доступа, маркера идентификации и маркера обновления. Маркер доступа (который позволяет получить доступ к ресурсам API) и маркер удостоверений хранятся в качестве параметров приложения, а навигация по страницам выполняется. Таким образом, общий эффект в мультиплатформенных приложениях eShop заключается в следующем: при условии, что пользователи могут успешно пройти проверку подлинности с помощью IdentityServer, они переходят к //Main/Catalog маршруту, который отображается TabbedPageCatalogView в качестве выбранной вкладки.

Сведения о навигации по страницам см. в разделе "Навигация". Сведения о том, как навигация WebView приводит к выполнению метода модели представления, см. в статье Вызов навигации с помощью поведения. Сведения о параметрах приложения см. в разделе "Управление конфигурацией".

Примечание.

EShop также позволяет выполнять вход в макет, когда приложение настроено на использование макетных служб в приложении SettingsView. В этом режиме приложение не взаимодействует с IdentityServer, а позволяет пользователю входить с помощью учетных данных.

Выход

Когда пользователь нажимает LOG OUT кнопку в ProfileViewклассе, LogoutCommandProfileViewModelLogoutAsync выполняется этот метод. Этот метод выполняет навигацию LoginView по страницам Logout , передав параметр запроса в значение true.

Этот параметр вычисляется в методе ApplyQueryAttributes . Logout Если параметр присутствует со true значением, PerformLogoutAsync выполняется метод LoginViewModel класса, который показан в следующем примере кода:

private async Task PerformLogoutAsync()
{
    await _appEnvironmentService.IdentityService.SignOutAsync();

    _settingsService.UseFakeLocation = false;

    UserName.Value = string.Empty;
    Password.Value = string.Empty;
}

Этот метод вызывает SignOutAsync метод в IdentityService классе, который вызывает OidcClient сеанс пользователя и очищает все сохраненные маркеры пользователя. Дополнительные сведения о параметрах приложения см. в разделе "Управление конфигурацией". Метод SignOutAsync показан в следующем примере кода:

public async Task<bool> SignOutAsync()
{
    var response = await GetClient().LogoutAsync(new LogoutRequest()).ConfigureAwait(false);

    if (response.IsError)
    {
        return false;
    }

    await _settingsService.SetUserTokenAsync(default);

    return !response.IsError;
}

Этот метод использует OidcClient URI для вызова URI конечной точки сеанса IdentityServer с необходимыми параметрами. Конечная точка сеанса находится в /connect/endsession порте 5105 базовой конечной точки, предоставляемой в качестве параметра пользователя. После успешного выхода LoginView пользователя отобразится пользователю, и все сохраненные сведения о пользователе будут удалены.

Сведения о навигации по страницам см. в разделе "Навигация". Сведения о том, как WebView навигация приводит к выполнению метода модели представления, см. в статье "Вызов навигации с помощью поведения". Сведения о параметрах приложения см. в разделе "Управление конфигурацией".

Примечание.

EShop также позволяет выходить из макета, когда приложение настроено на использование макетных служб в .SettingsView В этом режиме приложение не взаимодействует с IdentityServer и вместо этого очищает сохраненные маркеры из параметров приложения.

Авторизация

После проверки подлинности ASP.NET веб-API Core часто требуется авторизовать доступ, что позволяет службе предоставлять доступ к API некоторым пользователям, прошедшим проверку подлинности, но не всем.

Ограничение доступа к маршруту ASP.NET Core можно добиться путем применения атрибута Авторизовать к контроллеру или действию, который ограничивает доступ к контроллеру или действию для прошедших проверку подлинности пользователей, как показано в следующем примере кода:

[Authorize]
public sealed class BasketController : Controller
{
    // Omitted for brevity
}

Если несанкционированный пользователь пытается получить доступ к контроллеру или действию, помеченным атрибутом "Авторизовать", платформа API возвращает 401 (unauthorized) код состояния HTTP.

Примечание.

Параметры можно указать в атрибуте "Авторизовать", чтобы ограничить API определенным пользователям. Дополнительные сведения см. в разделе ASP.NET Основные документы: авторизация.

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

Авторизация по маркеру доступа.

Приложение eShop с несколькими платформами взаимодействует с микрослужбой удостоверений и запрашивает маркер доступа в рамках процесса проверки подлинности. Затем маркер доступа пересылается в API, предоставляемые микрослужбами заказа и корзины в рамках запросов на доступ. Маркеры доступа содержат сведения о клиенте и пользователе. Затем API используют эти сведения для авторизации доступа к их данным. Сведения о настройке IdentityServer для защиты API см. в разделе "Настройка ресурсов API".

Настройка IdentityServer для выполнения авторизации

Чтобы выполнить авторизацию с помощью IdentityServer, его ПО промежуточного слоя авторизации необходимо добавить в конвейер HTTP-запроса веб-приложения. ПО промежуточного слоя добавляется в AddDefaultAuthentication метод расширения, который вызывается из AddApplicationServices метода в Program классе и демонстрируется в следующем примере кода из эталонного приложения eShop:

public static IServiceCollection AddDefaultAuthentication(this IHostApplicationBuilder builder)
{
    var services = builder.Services;
    var configuration = builder.Configuration;

    var identitySection = configuration.GetSection("Identity");

    if (!identitySection.Exists())
    {
        // No identity section, so no authentication
        return services;
    }

    // prevent from mapping "sub" claim to nameidentifier.
    JsonWebTokenHandler.DefaultInboundClaimTypeMap.Remove("sub");

    services.AddAuthentication().AddJwtBearer(options =>
    {
        var identityUrl = identitySection.GetRequiredValue("Url");
        var audience = identitySection.GetRequiredValue("Audience");

        options.Authority = identityUrl;
        options.RequireHttpsMetadata = false;
        options.Audience = audience;
        options.TokenValidationParameters.ValidIssuers = [identityUrl];
        options.TokenValidationParameters.ValidateAudience = false;
    });

    services.AddAuthorization();

    return services;
}

Этот метод гарантирует, что к API можно получить доступ только с допустимым маркером доступа. ПО промежуточного слоя проверяет входящие маркеры, чтобы убедиться, что он отправляется из доверенного издателя и проверяет, является ли маркер допустимым для использования с API, который получает его. Таким образом, при просмотре в контроллер заказа или корзине возвращается 401 (unauthorized) код состояния HTTP, указывающий на необходимость маркера доступа.

Выполнение запросов доступа к API

При выполнении запросов к микрослужбам заказа и корзины маркер доступа, полученный от IdentityServer во время процесса проверки подлинности, должен быть включен в запрос, как показано в следующем примере кода:

public async Task CreateOrderAsync(Models.Orders.Order newOrder)
{
    var authToken = await _identityService.GetAuthTokenAsync().ConfigureAwait(false);

    if (string.IsNullOrEmpty(authToken))
    {
        return;
    }

    var uri = $"{UriHelper.CombineUri(_settingsService.GatewayOrdersEndpointBase, ApiUrlBase)}?api-version=1.0";

    var success = await _requestProvider.PostAsync(uri, newOrder, authToken, "x-requestid").ConfigureAwait(false);
}

Маркер доступа хранится с IIdentityService реализацией и может быть получен с помощью GetAuthTokenAsync метода.

Аналогичным образом маркер доступа должен быть включен при отправке данных в защищенный API IdentityServer, как показано в следующем примере кода:

public async Task ClearBasketAsync()
{
    var authToken = await _identityService.GetAuthTokenAsync().ConfigureAwait(false);

    if (string.IsNullOrEmpty(authToken))
    {
        return;
    }

    await GetBasketClient().DeleteBasketAsync(new DeleteBasketRequest(), CreateAuthenticationHeaders(authToken))
        .ConfigureAwait(false);
}

Маркер доступа извлекается из IIdentityService вызова ClearBasketAsync метода в BasketService классе.

Класс RequestProvider в мультиплатформенных приложениях eShop использует HttpClient класс для отправки запросов к API RESTful, предоставляемым эталонным приложением eShop. При выполнении запросов к API заказа и корзине, для которых требуется авторизация, допустимый маркер доступа должен быть включен в запрос. Это достигается путем добавления маркера доступа к заголовкам экземпляра HttpClient, как показано в следующем примере кода:

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

Свойство DefaultRequestHeadersHttpClient класса предоставляет заголовки, отправляемые с каждым запросом, и маркер доступа добавляется в Authorization заголовок, префикс с помощью строки Bearer. Когда запрос отправляется в API RESTful, значение Authorization заголовка извлекается и проверяется, чтобы убедиться, что он отправляется из доверенного издателя и используется для определения того, имеет ли пользователь разрешение на вызов API, который получает его.

Дополнительные сведения о том, как мультиплатформенное приложение eShop выполняет веб-запросы, см. в разделе "Доступ к удаленным данным".

Итоги

Существует множество подходов к интеграции проверки подлинности и авторизации в приложение .NET MAUI , которое взаимодействует с веб-приложением ASP.NET. Приложение eShop с несколькими платформами выполняет проверку подлинности и авторизацию с помощью контейнерной микрослужбы удостоверений, использующего IdentityServer. IdentityServer — это платформа OpenID Connect с открытым кодом и OAuth 2.0 для ASP.NET Core, которая интегрируется с ASP.NET Core Identity для проверки подлинности маркера носителя.

Мультиплатформенное приложение запрашивает маркеры безопасности из IdentityServer для проверки подлинности пользователя или доступа к ресурсу. При доступе к ресурсу маркер доступа должен быть включен в запрос к API, которым требуется авторизация. ПО промежуточного слоя IdentityServer проверяет входящие маркеры доступа, чтобы убедиться, что они отправляются из доверенного издателя, и что они действительны для использования с API, который получает их.