Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Совет
Это содержимое является фрагментом из электронной книги, шаблонов корпоративных приложений с помощью .NET MAUI, доступных в .NET Docs или в виде бесплатного скачиваемого PDF-файла, который можно прочитать в автономном режиме.
Проверка подлинности — это процесс получения учетных данных идентификации, таких как имя и пароль от пользователя, и проверка этих учетных данных в отношении центра. Сущность, отправленная учетными данными, считается удостоверением, прошедшим проверку подлинности, если учетные данные действительны. После установления удостоверения процесс авторизации определяет, имеет ли это удостоверение доступ к указанному ресурсу.
Существует множество подходов к интеграции проверки подлинности и авторизации в приложение .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.
Если конечная точка маркера получает допустимые сведения о проверке подлинности, код авторизации и средство проверки секрета 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, который получает их.