Чтобы настроить код для защищенного веб-API, изучите следующие сведения.
Что определяет интерфейсы API как защищенные.
Как настроить токен носителя.
Как проверить токен
Что определяет интерфейсы API ASP.NET и ASP.NET Core как защищенные?
Как и веб-приложения, ASP.NET и ASP.NET Основные веб-API защищаются, так как их действия контроллера префиксируются атрибутом [Авторизовать] . Действия контроллера могут вызываться только в том случае, если API вызывается с разрешенным удостоверением.
Оцените следующие вопросы.
Только приложение может вызывать веб-API. Как API узнает удостоверение приложения, которое его вызывает?
Если приложение вызывает API от имени пользователя, каково удостоверение пользователя?
Маркер носителя
Токен носителя, заданный в заголовке при вызове приложения, содержит сведения об удостоверении приложения. Он также содержит сведения о пользователе, если веб-приложение не принимает вызовы между службами из управляющего приложения.
Ниже приведен пример кода C#, в котором показан клиент, вызывающий API после получения маркера с помощью библиотеки проверки подлинности Майкрософт для .NET (MSAL.NET):
var scopes = new[] {$"api://.../access_as_user"};
var result = await app.AcquireToken(scopes)
.ExecuteAsync();
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
Внимание
Клиентское приложение запрашивает токен носителя на платформе идентификации Майкрософт для веб-API. API — это единственное приложение, которое должно проверить маркер и просмотреть утверждения, содержащиеся в нем. Клиентские приложения никогда не должны пытаться проверить утверждения в токенах.
В будущем для веб-API может потребоваться шифрование токена. Это требование помешает доступу к клиентским приложениям, которые могут просматривать токены доступа.
Конфигурация JwtBearer
В этом разделе описывается, как настроить токен носителя.
Файл конфигурации
Необходимо указать только в TenantId том случае, если вы хотите принять маркеры доступа из одного клиента (бизнес-приложение). В противном случае его можно оставить как common. Различные значения могут быть следующими:
Использование пользовательского URI идентификатора приложения для веб-API
Если вы приняли URI идентификатора приложения по умолчанию, предложенный порталом Azure, вам не нужно указывать аудиторию (см. URI и области действия идентификатора приложения). В противном случае следует добавить свойство Audience, значение которого является универсальным кодом ресурса (URI) идентификатора приложения для веб-API. Обычно это начинается с api://.
При вызове приложения в действии контроллера, которое содержит атрибут [Authorization], ASP.NET и ASP.NET Core извлекают маркер доступа из токена носителя заголовка авторизации. Затем маркер доступа перенаправляется в по промежуточного слоя JwtBearer, который вызывает расширения Microsoft IdentityModel для .NET.
Корпорация Майкрософт рекомендует использовать пакет NuGet Microsoft.Identity.Web при разработке веб-API с ASP.NET Core.
Microsoft.Identity.Web обеспечивает для .NET связь между ASP.NET Core, промежуточным слоем для проверки подлинности и библиотекой проверки подлинности Майкрософт (MSAL). Это обеспечивает более четкий и надежный опыт разработки и использует всю мощь платформы идентификации Майкрософт и Azure AD B2C.
ASP.NET для .NET 6.0
Чтобы создать проект веб-API, использующий Microsoft.Identity.Web, используйте шаблон проекта в .NET 6.0 CLI или Visual Studio.
.NET Core CLI
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio. Чтобы создать проект веб-API в Visual Studio, выберите Файл>Создать>Проект>ASP.NET Core Web API.
Шаблоны проектов .NET CLI и Visual Studio создают файл Program.cs , похожий на фрагмент кода. Обратите внимание Microsoft.Identity.Web на директиву using и строки, содержащие проверку подлинности и авторизацию.
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Microsoft.Identity.Web.OWIN предоставляет клей между ASP.NET, ПО промежуточного слоя проверки подлинности ASP.NET и библиотекой проверки подлинности Майкрософт (MSAL) для .NET. Это обеспечивает более четкий и надежный опыт разработки и использует всю мощь платформы идентификации Майкрософт и Azure AD B2C.
Он использует тот же файл конфигурации, что и ASP.NET Core (appsettings.json), и необходимо убедиться, что этот файл копируется с выходными данными проекта (копирование свойств всегда в свойствах файла в Visual Studio или в CSPROJ)
Microsoft.Identity.Web.OWIN добавляет методы расширения в IAppBuilder с именем AddMicrosoftIdentityWebApi. Этот метод принимает в качестве параметра экземпляр OwinTokenAcquirerFactory вызываемого OwinTokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>() объекта, и он создает экземпляр IServiceCollection , к которому можно добавить множество служб для вызова нижестоящих API или настройки кэша маркеров.
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Owin;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Client;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web.OWIN;
using System.Web.Services.Description;
namespace OwinWebApp
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
OwinTokenAcquirerFactory factory = TokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>();
app.AddMicrosoftIdentityWebApp(factory);
factory.Services
.Configure<ConfidentialClientApplicationOptions>(options => { options.RedirectUri = "https://localhost:44386/"; })
.AddMicrosoftGraph()
.AddDownstreamApi("DownstreamAPI1", factory.Configuration.GetSection("DownstreamAPI"))
.AddInMemoryTokenCaches();
factory.Build();
}
}
}
--
Проверка маркеров
В предыдущем фрагменте ПО промежуточного слоя JwtBearer (например, ПО промежуточного слоя OpenID Connect в веб-приложениях) проверяет токен (маркер) на основе значения TokenValidationParameters. Маркер расшифровывается по мере необходимости, извлекаются утверждения, и проверяется подпись. ПО промежуточного слоя затем проверяет маркер, проверяя эти данные:
Аудитория: маркер (токен) предназначен для веб-API.
Предмет: он был выпущен для приложения, которому разрешено вызывать веб-API.
Издатель: он был выдан доверенной службой маркеров безопасности (STS).
Срок действия: время существования в диапазоне.
Сигнатура: она не была изменена.
Также могут быть специальные проверки. Например, можно проверить, что ключи подписывания, внедренные в маркер, являются доверенными и что этот маркер не воспроизводится. Наконец, для некоторых протоколов требуются определенные проверки.
В следующей таблице описаны проверяющие элементы управления.
Проверяющий элемент управления
Description
ValidateAudience
Гарантирует, что токен предназначен для приложения, которое проверяет токен.
ValidateIssuer
Гарантирует, что маркер был выдан доверенной службой STS, то есть от доверенного лица.
ValidateIssuerSigningKey
Гарантирует, что приложение, проверяющее токен, доверяет ключу, который использовался для подписания токена. Существует особый случай, когда ключ внедряется в маркер. Но в этом случае такого обычно не возникает.
ValidateLifetime
Гарантирует, токен маркер все еще или уже является допустимым. Проверяющий элемент управления проверяет, находится ли время существования токена в диапазоне, указанном в утверждениях NotBefore и expires.
ValidateSignature
Гарантирует, что маркер не был изменен.
ValidateTokenReplay
Гарантирует, что маркер не воспроизводится. Существует особый случай использования некоторых одноразовых протоколов.
Настройка проверки маркера
Проверяющие элементы управления связаны со свойствами класса TokenValidationParameters. Свойства инициализируются из конфигурации ASP.NET и ASP.NET Core.
В большинстве случаев изменять параметры не требуется. Приложения, не являющиеся отдельными клиентами, являются исключениями. Эти веб-приложения принимают пользователей из любой организации или из личных учетных записей Майкрософт. Издатели в этом случае должны быть проверены. Microsoft.Identity.Web также отвечает за проверку издателя.
Если вы хотите настроить параметры проверки маркера в ASP.NET Core, используйте следующий фрагмент кода в вашем Startup.cs:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
});
В следующем примере кода для ASP.NET MVC показано, как выполнить пользовательскую проверку токена: