Korumalı web API'nizin kodunu yapılandırmak için şunları anlayın:
API'leri korumalı olarak tanımlayan şey.
Taşıyıcı belirteci yapılandırma.
Belirteci doğrulama.
ASP.NET ve ASP.NET Core API'lerini korumalı olarak tanımlayan nedir?
Web uygulamaları gibi ASP.NET ve ASP.NET Core web API'leri de denetleyici eylemlerine [Authorize] özniteliği eklendiği için korunur. Denetleyici eylemleri yalnızca API yetkili bir kimlikle çağrıldığında çağrılabilir.
Aşağıdaki soruları göz önünde bulundurun:
Yalnızca bir uygulama web API'sini çağırabilir. API, onu çağıran uygulamanın kimliğini nasıl biliyor?
Uygulama API'yi bir kullanıcı adına çağırırsa kullanıcının kimliği nedir?
Taşıyıcı belirteci
Uygulama çağrıldığında üst bilgide ayarlanan taşıyıcı belirteci, uygulama kimliği hakkındaki bilgileri tutar. Ayrıca, web uygulaması bir daemon uygulamasından hizmetten hizmete çağrıları kabul etmediği sürece kullanıcı hakkında bilgi de tutar.
.NET için Microsoft Authentication Library (MSAL.NET) ile belirteç aldıktan sonra API'yi çağıran bir istemciyi gösteren bir C# kod örneği aşağıda verilmiştir:
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);
Önemli
İstemci uygulaması, web API'sinin Microsoft kimlik platformu taşıyıcı belirtecini istemektedir. API, belirteci doğrulamalı ve içerdiği talepleri görüntülemesi gereken tek uygulamadır. İstemci uygulamaları hiçbir zaman belirteçlerdeki talepleri incelemeyi denememelidir.
Gelecekte web API'sinin belirtecin şifrelenmesini gerektirebilir. Bu gereksinim, erişim belirteçlerini görüntüleyebilen istemci uygulamalarına erişimi engeller.
JwtBearer yapılandırması
Bu bölümde taşıyıcı belirtecinin nasıl yapılandırıldığı açıklanmaktadır.
Yapılandırma dosyası
Yalnızca tek bir kiracıdan (iş kolu uygulaması) erişim belirteçlerini kabul etmek istiyorsanız belirtmeniz TenantId gerekir. Aksi takdirde, olarak commonbırakılabilir. Farklı değerler:
GUID (Kiracı Kimliği = Dizin Kimliği)
common herhangi bir kuruluş ve kişisel hesap olabilir
Web API'si için özel Uygulama Kimliği URI'si kullanma
Azure portalı tarafından önerilen varsayılan Uygulama Kimliği URI'sini kabul ettiyseniz, hedef kitleyi belirtmeniz gerekmez (bkz . Uygulama Kimliği URI'si ve kapsamları). Aksi takdirde, değeri web API'niz için Uygulama Kimliği URI'si olan bir Audience özellik ekleyin. Bu genellikle ile api://başlar.
[Authorize] özniteliğine sahip bir denetleyici eyleminde bir uygulama çağrıldığında ASP.NET ve ASP.NET Core, Yetkilendirme üst bilgisinin taşıyıcı belirtecinden erişim belirtecini ayıklar. Erişim belirteci daha sonra .NET için Microsoft IdentityModel Uzantılarını çağıran JwtBearer ara yazılımına iletilir.
Microsoft, ASP.NET Core ile bir web API'sini geliştirirken Microsoft.Identity.Web NuGet paketini kullanmanızı önerir.
Microsoft.Identity.Web ASP.NET Core, kimlik doğrulama ara yazılımı ve .NET için Microsoft Authentication Library (MSAL) arasında tutkal sağlar. Daha net ve daha güçlü bir geliştirici deneyimi sağlar ve Microsoft kimlik platformu ve Azure AD B2C'nin gücünden yararlanıyor.
.NET 6.0 için ASP.NET
Microsoft.Identity.Web kullanan yeni bir web API'si projesi oluşturmak için .NET 6.0 CLI veya Visual Studio'da bir proje şablonu kullanın.
Dotnet core CLI
# Create new web API that uses Microsoft.Identity.Web
dotnet new webapi --auth SingleOrg
Visual Studio - Visual Studio'da web API'si projesi oluşturmak için Dosya>Yeni>Proje>ASP.NET Core Web API'sini seçin.
Hem .NET CLI hem de Visual Studio proje şablonları, bu kod parçacığına benzer bir Program.cs dosyası oluşturur. yönergesini ve kimlik doğrulaması ve yetkilendirmeyi içeren satırların kullanıldığına dikkat edin Microsoft.Identity.Web .
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, ASP.NET ile bir web API'sini geliştirirken Microsoft.Identity.Web.OWIN NuGet paketini kullanmanızı önerir.
Microsoft.Identity.Web.OWIN ASP.NET, ASP.NET kimlik doğrulama ara yazılımı ve .NET için Microsoft Authentication Library (MSAL) arasındaki tutkalı sağlar. Daha net ve daha güçlü bir geliştirici deneyimi sağlar ve Microsoft kimlik platformu ve Azure AD B2C'nin gücünden yararlanıyor.
ASP.NET Core (appsettings.json) ile aynı yapılandırma dosyasını kullanır ve bu dosyanın projenizin çıkışıyla kopyalandığından emin olmanız gerekir (özellik kopyası her zaman Visual Studio'daki dosya özelliklerinde veya .csproj'da)
Microsoft.Identity.Web.OWIN , IAppBuilder'a adlı AddMicrosoftIdentityWebApibir uzantı yöntemi ekler. Bu yöntem, çağırdığınız OwinTokenAcquirerFactory.GetDefaultInstance<OwinTokenAcquirerFactory>() ve aşağı akış API'lerini çağırmak veya belirteç önbelleğini yapılandırmak için birçok hizmet ekleyebileceğiniz bir örneğini ortaya çıkaran bir örneğini IServiceCollection parametre OwinTokenAcquirerFactory olarak alır.
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();
}
}
}
--
Belirteç doğrulama
Yukarıdaki kod parçacığında, web uygulamalarında OpenID Connect ara yazılımı gibi JwtBearer ara yazılımı belirteci değerine TokenValidationParametersgöre doğrular. Belirtecin şifresi gerektiği gibi çözülür, talepler ayıklanır ve imza doğrulanır. Ara yazılım daha sonra şu verileri denetleyerek belirteci doğrular:
hedef kitle: Belirteç web API'sine yöneliktir.
Alt: Web API'sini çağırmasına izin verilen bir uygulama için verilmiştir.
Veren: Güvenilen bir güvenlik belirteci hizmeti (STS) tarafından verildi.
Süre sonu: Yaşam süresi aralıktadır.
İmza: Üzerinde oynanmamış.
Özel doğrulamalar da olabilir. Örneğin, belirteç içine eklendiğinde imzalama anahtarlarının güvenilir olduğunu ve belirtecin yeniden oynatılmadığını doğrulamak mümkündür. Son olarak, bazı protokoller belirli doğrulamalar gerektirir.
Belirtecin sizin için belirteci doğrulayan uygulamaya yönelik olduğundan emin olun.
ValidateIssuer
Belirtecin güvenilen bir STS tarafından verildiğinden emin olur, yani güvendiğiniz birinden gelir.
ValidateIssuerSigningKey
Belirteci doğrulayan uygulamanın belirteci imzalamak için kullanılan anahtara güvenmesini sağlar. Anahtarın belirtecin içine eklendiği özel bir durum vardır. Ancak bu dava genellikle ortaya çıkmaz.
ValidateLifetime
Belirtecin hala veya zaten geçerli olduğundan emin olur. Doğrulayıcı, belirtecin ömrünün yukarıda belirtilen aralıkta olup olmadığını denetler ve taleplerin süresi dolar.
ValidateSignature
Belirtecin üzerinde oynanmamasını sağlar.
ValidateTokenReplay
Belirtecin yeniden oynatılamamasını sağlar. Bazı tek seferlik kullanım protokolleri için özel bir durum vardır.
Belirteç doğrulamayı özelleştirme
Doğrulayıcılar TokenValidationParameters sınıfının özellikleriyle ilişkilendirilir. Özellikler ASP.NET ve ASP.NET Core yapılandırmasından başlatılır.
Çoğu durumda, parametreleri değiştirmeniz gerekmez. Tek kiracı olmayan uygulamalar özel durumlardır. Bu web uygulamaları herhangi bir kuruluştan veya kişisel Microsoft hesaplarından kullanıcıları kabul edebilir. Bu durumda verenlerin doğrulanması gerekir. Microsoft.Identity.Web, verenin doğrulamasını da üstlenir.
ASP.NET Core'da belirteç doğrulama parametrelerini özelleştirmek istiyorsanız, Startup.cs aşağıdaki kod parçacığını kullanın:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration);
services.Configure<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.ValidAudiences = new[] { /* list of valid audiences */};
});
ASP.NET MVC için, aşağıdaki kod örneği özel belirteç doğrulama işleminin nasıl yapılacağını gösterir:
Ayrıca Azure İşlevleri gelen erişim belirteçlerini de doğrulayabilirsiniz. Bu tür doğrulama örneklerini GitHub'daki aşağıdaki kod örneklerinde bulabilirsiniz: