Aracılığıyla paylaş


Microsoft Entra Id ile bir ASP.NET Çekirdeğinin Blazor Web App güvenliğini sağlama

Bu makalede, örnek bir uygulama kullanarak Microsoft Entra ID için Microsoft Web paketleriyle Microsoft Kimlik Platformu aracılığıyla Blazor Web App bileşeninin güvenliğini sağlama işlemi açıklanmaktadır.

Makalenin bu sürümü, Ön Uç için Arka Uç (BFF) desenini benimsemeden Entra'nın uygulanmasına odaklanır. BFF düzeni, dış hizmetlere kimliği doğrulanmış istekler yapmak için kullanışlıdır. Uygulamanın belirtimi BFF desenini benimsemeyi çağırıyorsa makale sürümü seçicisini BFF deseni olarak değiştirin.

Aşağıdaki belirtim kapsanmaktadır:

  • Blazor Web App, genel etkileşimle (InteractiveAuto) Otomatik işleme modunu kullanır.
  • Sunucu projesi, istemciye kimlik doğrulama durumunu akışla göndermek için AddAuthenticationStateSerialization kullanan bir sunucu tarafı kimlik doğrulama durumu sağlayıcısı eklemek üzere PersistentComponentState çağırır. İstemci, sunucu tarafından geçirilen kimlik doğrulama durumunu seri durumdan çıkarmak ve kullanmak için AddAuthenticationStateDeserialization çağırır. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.
  • Uygulama, Microsoft Web paketlerini temel alan Microsoft Identity Entra Id kullanır.
  • Otomatik etkileşimli olmayan belirteç yenilemesi çerçeve tarafından yönetilir.
  • Uygulama, oluşturulan hava durumu verilerini görüntülemek için sunucu tarafı ve istemci tarafı hizmet soyutlamalarını kullanır:
    • Bileşen, hava durumu verilerini görüntülemek için sunucuda işlenirken Weather öğesini ServerWeatherForecasterkullanır. Microsoft Identity Web paketleri, web API çağrıları yapmak için adlandırılmış bir aşağı akış web hizmeti oluşturmak için API sağlar. IDownstreamApi, dış web API'sinden hava durumu verilerini almak amacıyla ServerWeatherForecaster'yi çağırmak için kullanılan CallApiForUserAsync içine eklenir (MinimalApiJwt projesi).
    • İstemcide Weather bileşeni işlendiğinde, bileşen ClientWeatherForecaster hizmet uygulamasını kullanır ve bu, istemci projesinin HttpClient dosyasında önceden yapılandırılmış Program kullanarak sunucu projesinin Minimal API'si (/weather-forecast) için bir web API çağrısı yapar ve hava durumu verilerini alır. Minimal API uç noktası, hava durumu verilerini ServerWeatherForecaster sınıfından alır ve bileşen tarafından işlenmesi için istemciye geri döndürür.

Örnek çözüm

Örnek çözüm aşağıdaki projelerden oluşur:

  • BlazorWebAppEntra: Blazor Web App öğesinin sunucu tarafı projesi, hava durumu verileri için bir örnek Minimal API uç noktası içermektedir.
  • BlazorWebAppEntra.Client: Blazor Web App'ın istemci tarafı projesi.
  • MinimalApiJwt: Hava durumu verileri için Minimal API uç noktası örneğini içeren arka uç API.

Aşağıdaki bağlantıyla örnek deposundaki Blazor en son sürüm klasörü aracılığıyla örneğe erişin. Örnek, .NET 9 veya sonraki bir sürümün klasöründedir BlazorWebAppEntra .

Çözümü projedenAspire/Aspire.AppHost başlatın.

Örnek kodu görüntüleme veya indirme (indirme)

Microsoft Entra Id uygulama kayıtları

Uygulamalar ve web API'leri aynı çözümde olsa bile uygulamalar ve web API'leri için ayrı kayıtlar kullanmanızı öneririz. Aşağıdaki kılavuz, örnek çözümün BlazorWebAppEntra uygulama ve MinimalApiJwt web API'sine yöneliktir, ancak aynı kılavuz genellikle uygulamalar ve web API'leri için tüm Entra tabanlı kayıtlar için geçerlidir.

Uygulamayı kaydederken web API'sine erişim verebilmeniz için önce web API'sini (MinimalApiJwt) kaydedin. Web API'sinin kiracı kimliği ve istemci kimliği, web API'sini Program dosyasında yapılandırmak için kullanılır. Web API'yi kaydettikten sonra Uygulama kayıtları> bölümünde Bir API'yi Kullanıma Sun altında belirli bir Weather.Get kapsam adı ile web API'sini kullanıma sunun. Uygulama yapılandırmasında kullanmak üzere Uygulama Kimliği URI'sini kaydedin.

Ardından, uygulamayı (BlazorWebAppEntra) Yeniden Yönlendirme URI'sinin altında iki giriş içeren bir Web platformu yapılandırmasıyla kaydedin: https://localhost/signin-oidc ve https://localhost/signout-callback-oidc (bu URI'lerde bağlantı noktaları gerekli değildir). Ön kanal oturumu kapatma URL'sini şu şekilde ayarlayın: https://localhost/signout-callback-oidc (bağlantı noktası gerekmez). Uygulamanın kiracı kimliği, kiracı alan adı ve istemci kimliği ile web API'sinin temel adresi, uygulama kimliği URI'si ve hava durumu kapsamı adı, uygulamayı appsettings.json dosyasında yapılandırmak için kullanılır. Uygulama kayıtları>API izinleri bölümünde web API'sine erişim izni verin. Uygulamanın güvenlik belirtimleri bunu gerektiriyorsa, kuruluşun web API'sine erişmesi için yönetici onayı verebilirsiniz. Yetkili kullanıcılar ve gruplar, Uygulama kayıtları bölümünde uygulamanın kaydına, >'a atanır.

Entra veya Azure portalının Örtük verme ve karma akışlar uygulama kayıt yapılandırmasında, yetkilendirme uç noktasının Erişim belirteçlerini veya kimlik belirteçlerini döndürmesi için hiçbir onay kutusunu seçmeyin. OpenID Connect işleyicisi, yetkilendirme uç noktasından döndürülen kodu kullanarak uygun belirteçleri otomatik olarak istemektedir.

Entra veya Azure portalında uygulamanın kaydında bir istemci gizli dizisi oluşturun (Yönet>Sertifikalar & Gizli Diziler>Yeni istemci gizli dizisi). Sonraki bölümde kullanmak için istemci gizli Değerini saklayın.

Bu makalenin devamında belirli ayarlar için ek Entra yapılandırma kılavuzu sağlanmıştır.

Sunucu tarafı Blazor Web App projesi (BlazorWebAppEntra)

BlazorWebAppEntra projesi, Blazor Web App sunucu tarafı projesidir.

İstemci yanlı Blazor Web App projesi (BlazorWebAppEntra.Client)

BlazorWebAppEntra.Client projesi, Blazor Web App için istemci tarafı projesidir.

kullanıcının istemci tarafı işleme sırasında oturum açması veya kapatması gerekiyorsa, tam sayfa yeniden yükleme başlatılır.

Arka uç web API'si projesi (MinimalApiJwt)

Proje MinimalApiJwt , birden çok ön uç projesi için bir arka uç web API'sidir. Proje, hava durumu verileri için en düşük API uç noktasını yapılandırıyor.

Dosya, MinimalApiJwt.http hava durumu veri isteğini test için kullanılabilir. MinimalApiJwt Uç noktayı test etmek için projenin çalışıyor olması gerektiğini ve uç noktanın dosyaya sabit kodlandığını unutmayın. Daha fazla bilgi için bkz . Visual Studio 2022'de .http dosyalarını kullanma.

Proje, OpenAPI belgeleri üretmek için paketler ve yapılandırma içerir.

Projenin Program dosyasında güvenli bir hava durumu tahmini veri uç noktası bulunur:

app.MapGet("/weather-forecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
}).RequireAuthorization();

RequireAuthorization Uzantı yöntemi, yol tanımı için yetkilendirme gerektirir. Projeye eklediğiniz tüm denetleyiciler için, özniteliğini [Authorize] denetleyiciye veya eyleme ekleyin.

Arka uç web API'sini yapılandırma projesi (MinimalApiJwt)

JwtBearerOptions projesini AddJwtBearer dosyasındaki MinimalApiJwt'nin Program çağrısında yapılandırın.

Web API'sinin kaydı için kapsam, Weather.GetApi'yi kullanıma sunma bölümünde Entra veya Azure portalında yapılandırılır.

Authority OIDC çağrıları yapmak için Yetki Otoritesini ayarlar.

jwtOptions.Authority = "{AUTHORITY}";

Aşağıdaki örneklerde kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeee ve dizin adı contosokullanılır.

Uygulama bir ME-ID kiracısında kayıtlıysa, yetki, kimlik sağlayıcısı tarafından döndürülen JWT'nin düzenleyici (iss) ile eşleşmelidir.

jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";

Uygulama bir Microsoft Entra Harici Kimlik kiracısında kayıtlıysa:

jwtOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Uygulama bir AAD B2C kiracısında kayıtlıysa:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Note

Azure Active Directory B2C artık 1 Mayıs 2025 itibarıyla yeni müşteriler tarafından hizmet olarak sunulmamaktadır. AAD B2C kiracıları, 1 Mayıs 2025'ten önce oluşturulan hesapları olan müşteriler için 2030'a kadar desteklenecektir. Daha fazla bilgi için bkz. Azure AD B2C: Sık sorulan sorular (SSS).

Audience alınan JWT erişim belirtecinin Hedef Kitlesini ayarlar.

jwtOptions.Audience = "{AUDIENCE}";

Değeri yalnızca Entra veya Azure portalında, bir API'yi Kullanıma Sun altında kapsam eklerken yapılandırılan Weather.Get yoluna eşleştirin. Değere kapsam adını ("Weather.Get," eklemeyin.

Aşağıdaki örnekler, 11112222-bbbb-3333-cccc-4444dddd5555 Uygulama (İstemci) Kimliği kullanır. Üçüncü örnekte kiracı etki alanı contoso.onmicrosoft.comkullanılır.

ME-ID kiracı örneği:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Microsoft Entra Dış Kimlik kiracısı:

jwtOptions.Audience = "11112222-bbbb-3333-cccc-4444dddd5555";

AAD B2C kiracı örneği:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Sunucu projesini yapılandırma (BlazorWebAppEntra)

AddMicrosoftIdentityWebApp Microsoft Identity Web'den (Microsoft.Identity.WebNuGet paketi, API belgeleri) projenin BlazorWebAppEntra dosyasında yapılandırılırProgram.

Uygulamanın Entra veya Azure portalındaki kaydından uygulama (istemci) kimliğini, kiracı (yayımcı) etki alanını ve dizin (kiracı) kimliğini alın. Web API'nin kaydından Weather.Get kapsamı için Uygulama Kimliği URI'si elde edilir. Portaldan Uygulama Kimliği URI'sini alırken kapsam adını eklemeyin.

Kimlik doğrulama yapılandırması kiracının türüne bağlıdır:

ME-ID kiracı yapılandırması

Bu bölüm, Microsoft Entra Id veya Azure AAD B2C kiracısında kayıtlı bir uygulama için geçerlidir.

BlazorWebAppEntra Projenin Program dosyasında, Microsoft Identity Web yapılandırmasında aşağıdaki yer tutucuların değerlerini sağlayın:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.Domain = "{DIRECTORY NAME}.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "{TENANT ID}";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Önceki yapılandırmadaki yer tutucular:

  • {CLIENT ID (BLAZOR APP)}: Uygulama (istemci) kimliği.
  • {DIRECTORY NAME}: Kiracı (yayımcı) etki alanının dizin adı.
  • {TENANT ID}: Kiracı (dizin) kimliği.
  • {BASE ADDRESS}: Web API'sinin temel adresi.
  • {APP ID URI}: Web API'si kapsamları için Uygulama Kimliği URI'si. Aşağıdaki biçimlerden biri kullanılır; burada {CLIENT ID (WEB API)} yer tutucu web API'sinin Entra kaydının İstemci Kimliği, {DIRECTORY NAME} yer tutucu ise kiracı (yayımcılar) etki alanının dizin adıdır (örnek: contoso).
    • ME-ID kiracı formatı: api://{CLIENT ID (WEB API)}
    • B2C kiracı biçimi: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.Domain = "contoso.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Microsoft Entra Dış Kimlik yapılandırması

Bu bölüm, Microsoft Entra Dış Kimlik kiracısında kayıtlı bir uygulama için geçerlidir.

BlazorWebAppEntra Projenin Program dosyasında, Microsoft Identity Web yapılandırmasında aşağıdaki yer tutucuların değerlerini sağlayın:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Önceki yapılandırmadaki yer tutucular:

  • {DIRECTORY NAME}: Kiracı (yayımcı) etki alanının dizin adı.
  • {CLIENT ID (BLAZOR APP)}: Uygulama (istemci) kimliği.
  • {BASE ADDRESS}: Web API'sinin temel adresi.
  • {APP ID URI}: Web API'si kapsamları için Uygulama Kimliği URI'si. Aşağıdaki biçimlerden biri kullanılır; burada {CLIENT ID (WEB API)} yer tutucu web API'sinin Entra kaydının İstemci Kimliği, {DIRECTORY NAME} yer tutucu ise kiracı (yayımcı) etki alanının dizin adıdır (örnek: contoso).
    • ME-ID veya Microsoft Entra Dış Kimlik kiracı biçimi: api://{CLIENT ID (WEB API)}
    • B2C kiracı biçimi: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Geri çağırma yolu (CallbackPath), uygulamayı Entra veya Azure portalına kaydederken yapılandırılan yeniden yönlendirme URI'sine (oturum açma geri çağırma yolu) eşleşmelidir. Uygulamanın kaydının Kimlik Doğrulaması panelinde yollar yapılandırılır. Varsayılan değer, CallbackPath kayıtlı yönlendirme URI'si için /signin-oidc'dir (bağlantı noktası gerekli değildir).

SignedOutCallbackPath, OpenID Connect işleyicisi tarafından uygulamanın temel yolu içinde kesilen istek yoludur ve bu yol üzerinden kullanıcı aracıcısı Entra'dan oturum kapatıldıktan sonra ilk kez geri döndürülür. "/signout-callback-oidc" varsayılan değeri kullanıldığından örnek uygulama yol için bir değer ayarlamaz. İsteği kestikten sonra, OpenID Connect işleyicisi, belirtilmişse, SignedOutRedirectUri'a ya da RedirectUri'e yönlendirir.

Warning

Uygulama gizli dizilerini, bağlantı dizesi'leri, kimlik bilgilerini, parolaları, kişisel kimlik numaralarını (PIN'ler), özel C#/.NET kodunu veya özel anahtarları/belirteçleri her zaman güvenli olmayan istemci tarafı kodunda depolamayın. Test/hazırlama ve üretim ortamlarında, sunucu tarafı Blazor kod ve web API'leri, proje kodu veya yapılandırma dosyalarında kimlik bilgilerinin korunmasını önleyen güvenli kimlik doğrulama akışları kullanmalıdır. Yerel geliştirme testlerinin dışında, ortam değişkenleri en güvenli yaklaşım olmadığından hassas verileri depolamak için ortam değişkenlerinin kullanılmasından kaçınmanızı öneririz. Yerel geliştirme testinde gizli verilerin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracı önerilir. Daha fazla bilgi için bkz . Hassas verileri ve kimlik bilgilerini güvenli bir şekilde koruma.

Makalenin bu sürümü, Entra'nın "Ön Uç için Arka Uç" (BFF) tasarımı ile uygulanmasını kapsamaktadır. Uygulamanın belirtimi BFF yapısını benimsemeyi gerektirmiyorsa, sürüm seçiciyi BFF Dışı yapı olarak değiştirin.

Aşağıdaki belirtim kapsanmaktadır:

  • Blazor Web App, genel etkileşimle (InteractiveAuto) Otomatik işleme modunu kullanır.
  • Sunucu projesi, istemciye kimlik doğrulama durumunu akışla göndermek için AddAuthenticationStateSerialization kullanan bir sunucu tarafı kimlik doğrulama durumu sağlayıcısı eklemek üzere PersistentComponentState çağırır. İstemci, sunucu tarafından geçirilen kimlik doğrulama durumunu seri durumdan çıkarmak ve kullanmak için AddAuthenticationStateDeserialization çağırır. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.
  • Uygulama, Microsoft Web paketlerini temel alan Microsoft Identity Entra Id kullanır.
  • Otomatik etkileşimli olmayan belirteç yenilemesi çerçeve tarafından yönetilir.
  • Ön Uç için Arka Uç (BFF) deseni, hizmet keşfi için Aspire kullanılarak ve YARP'ın arka uç uygulamasındaki bir hava durumu tahmin noktasına istekleri vekil sunucu olarak iletmesi için benimsenir.
    • Bir arka uç web API'si, Blazor Web App tarafından cookie oturum açmada kaydedilen JWT belirteçlerini doğrulamak için JWT taşıyıcı kimlik doğrulaması kullanır.
    • Aspire .NET buluta özel uygulamalar oluşturma deneyimini geliştirir. Dağıtılmış uygulamalar oluşturmak ve çalıştırmak için tutarlı, fikirli bir araç ve desen kümesi sağlar.
    • YARP (Bir Başka Ters Proxy), ters proxy sunucusu oluşturmak için kullanılan bir kütüphanedir.
  • Uygulama, oluşturulan hava durumu verilerini görüntülemek için sunucu tarafı ve istemci tarafı hizmet soyutlamalarını kullanır.
    • Bileşen, hava durumu verilerini görüntülemek için sunucuda işlenirken Weather öğesini ServerWeatherForecasterkullanır. Microsoft Identity Web paketleri, web API çağrıları yapmak için adlandırılmış bir aşağı akış web hizmeti oluşturmak için API sağlar. IDownstreamApi, dış web API'sinden hava durumu verilerini almak amacıyla ServerWeatherForecaster'yi çağırmak için kullanılan CallApiForUserAsync içine eklenir (MinimalApiJwt projesi).
    • İstemcide Weather bileşeni işlendiğinde, bileşen ClientWeatherForecaster hizmet uygulamasını kullanır ve bu, istemci projesinin HttpClient dosyasında önceden yapılandırılmış Program kullanarak sunucu projesinin Minimal API'si (/weather-forecast) için bir web API çağrısı yapar ve hava durumu verilerini alır. Minimum API uç noktası, çağırarak GetAccessTokenForUserAsynckullanıcı için bir erişim belirteci alır. Doğru kapsamlarla birlikte, dış web API projesine (MinimalApiJwt) hava durumu verilerini almak ve bileşen tarafından işlenebilmesi için istemciye döndürmek amacıyla bir ters proxy çağrısı yapılır.

Prerequisites

Aspire Visual Studio sürüm 17.10 veya üzerini gerektirir.

Ayrıca, Aspire bölümüne bakın.

Örnek çözüm

Örnek çözüm aşağıdaki projelerden oluşur:

  • Aspire:
    • Aspire.AppHost: Uygulamanın üst düzey düzenleme sorunlarını yönetmek için kullanılır.
    • Aspire.ServiceDefaults: Gerektiğinde genişletilebilen ve özelleştirilebilen varsayılan Aspire uygulama yapılandırmalarını içerir.
  • MinimalApiJwt: Hava durumu verileri için Minimal API uç noktası örneğini içeren arka uç API.
  • BlazorWebAppEntra: Blazor Web App için sunucu tarafı projesi.
  • BlazorWebAppEntra.Client: Blazor Web App'ın istemci tarafı projesi.

Aşağıdaki bağlantıyla örnek deposundaki Blazor en son sürüm klasörü aracılığıyla örneğe erişin. Örnek, .NET 9 veya sonraki bir sürümün klasöründedir BlazorWebAppEntraBff .

Örnek kodu görüntüleme veya indirme (indirme)

Microsoft Entra Id uygulama kayıtları

Uygulamalar ve web API'leri aynı çözümde olsa bile uygulamalar ve web API'leri için ayrı kayıtlar kullanmanızı öneririz. Aşağıdaki kılavuz, örnek çözümün BlazorWebAppEntra uygulama ve MinimalApiJwt web API'sine yöneliktir, ancak aynı kılavuz genellikle uygulamalar ve web API'leri için tüm Entra tabanlı kayıtlar için geçerlidir.

Uygulamayı kaydederken web API'sine erişim verebilmeniz için önce web API'sini (MinimalApiJwt) kaydedin. Web API'sinin kiracı kimliği ve istemci kimliği, web API'sini Program dosyasında yapılandırmak için kullanılır. Web API'yi kaydettikten sonra Uygulama kayıtları> bölümünde Bir API'yi Kullanıma Sun altında belirli bir Weather.Get kapsam adı ile web API'sini kullanıma sunun. Uygulama yapılandırmasında kullanmak üzere Uygulama Kimliği URI'sini kaydedin.

Ardından, uygulamayı (BlazorWebAppEntra) Yeniden Yönlendirme URI'sinin altında iki giriş içeren bir Web platformu yapılandırmasıyla kaydedin: https://localhost/signin-oidc ve https://localhost/signout-callback-oidc (bu URI'lerde bağlantı noktaları gerekli değildir). Uygulamanın kiracı kimliği, kiracı alan adı ve istemci kimliği ile web API'sinin temel adresi, uygulama kimliği URI'si ve hava durumu kapsamı adı, uygulamayı appsettings.json dosyasında yapılandırmak için kullanılır. Uygulama kayıtları>API izinleri bölümünde web API'sine erişim izni verin. Uygulamanın güvenlik belirtimleri bunu gerektiriyorsa, kuruluşun web API'sine erişmesi için yönetici onayı verebilirsiniz. Yetkili kullanıcılar ve gruplar, Uygulama kayıtları bölümünde uygulamanın kaydına, >'a atanır.

Entra veya Azure portalının Örtük verme ve karma akışlar uygulama kayıt yapılandırmasında, yetkilendirme uç noktasının Erişim belirteçlerini veya kimlik belirteçlerini döndürmesi için hiçbir onay kutusunu seçmeyin. OpenID Connect işleyicisi, yetkilendirme uç noktasından döndürülen kodu kullanarak uygun belirteçleri otomatik olarak istemektedir.

Entra veya Azure portalında uygulamanın kaydında bir istemci gizli dizisi oluşturun (Yönet>Sertifikalar & Gizli Diziler>Yeni istemci gizli dizisi). Sonraki bölümde kullanmak için istemci gizli Değerini saklayın.

Bu makalenin devamında belirli ayarlar için ek Entra yapılandırma kılavuzu sağlanmıştır.

Aspire projeler

Örnek uygulamanın Aspire kullanılmasına ve .AppHost ile .ServiceDefaults projelerinin ayrıntılarına dair daha fazla bilgi için Aspire belgelerine bakın.

Emin olun ki Aspire için önkoşulları karşıladınız. Daha fazla bilgi için Aspire bölümüne bakın.

Örnek uygulama yalnızca geliştirme testi sırasında kullanılmak üzere güvenli olmayan bir HTTP başlatma profili (http) yapılandırıyor. Daha fazla bilgi için, güvenli olmayan ve güvenli başlatma ayarları profili örnekleri de dahil olmak üzere, bkz. Güvenli olmayan aktarıma izin verin (AspireAspire belgeleri).

Sunucu tarafı Blazor Web App projesi (BlazorWebAppEntra)

BlazorWebAppEntra projesi, Blazor Web App sunucu tarafı projesidir.

İstemci yanlı Blazor Web App projesi (BlazorWebAppEntra.Client)

BlazorWebAppEntra.Client projesi, Blazor Web App için istemci tarafı projesidir.

kullanıcının istemci tarafı işleme sırasında oturum açması veya kapatması gerekiyorsa, tam sayfa yeniden yükleme başlatılır.

Arka uç web API'si projesi (MinimalApiJwt)

Proje MinimalApiJwt , birden çok ön uç projesi için bir arka uç web API'sidir. Proje, hava durumu verileri için en düşük API uç noktasını yapılandırıyor. Sunucu tarafı Blazor Web App projesinden (BlazorWebAppEntra) gelen istekler MinimalApiJwt projesine yönlendirilir.

Dosya, MinimalApiJwt.http hava durumu veri isteğini test için kullanılabilir. MinimalApiJwt Uç noktayı test etmek için projenin çalışıyor olması gerektiğini ve uç noktanın dosyaya sabit kodlandığını unutmayın. Daha fazla bilgi için bkz . Visual Studio 2022'de .http dosyalarını kullanma.

Proje, OpenAPI belgeleri üretmek için paketler ve yapılandırma içerir.

Projenin Program dosyasında güvenli bir hava durumu tahmini veri uç noktası bulunur:

app.MapGet("/weather-forecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
}).RequireAuthorization();

RequireAuthorization Uzantı yöntemi, yol tanımı için yetkilendirme gerektirir. Projeye eklediğiniz tüm denetleyiciler için, özniteliğini [Authorize] denetleyiciye veya eyleme ekleyin.

Arka uç web API'sini yapılandırma projesi (MinimalApiJwt)

Projenin MinimalApiJwt dosyasındaki JwtBearerOptions çağrısında AddJwtBearer projesini Program olarak yapılandırın.

Web API'sinin kaydı için kapsam, Weather.GetApi'yi kullanıma sunma bölümünde Entra veya Azure portalında yapılandırılır.

Authority OIDC çağrıları yapmak için Yetki Otoritesini ayarlar.

jwtOptions.Authority = "{AUTHORITY}";

Aşağıdaki örneklerde kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeee ve dizin adı contosokullanılır.

Uygulama bir ME-ID kiracısında kayıtlıysa, yetki, kimlik sağlayıcısı tarafından döndürülen JWT'nin düzenleyici (iss) ile eşleşmelidir.

jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";

Uygulama bir Microsoft Entra External ID kiracısında kayıtlıysa:

jwtOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Uygulama bir AAD B2C kiracısında kayıtlıysa:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Note

Azure Active Directory B2C artık 1 Mayıs 2025 itibarıyla yeni müşteriler tarafından hizmet olarak sunulmamaktadır. AAD B2C kiracıları, hesapları 1 Mayıs 2025'ten önce oluşturulmuş müşteriler için 2030 yılına kadar desteklenecektir. Daha fazla bilgi için bkz. Azure AD B2C: Sık sorulan sorular (SSS).

Audience alınan JWT erişim belirtecinin Hedef Kitlesini ayarlar.

jwtOptions.Audience = "{AUDIENCE}";

Değeri yalnızca Entra veya Azure portalında, bir API'yi Kullanıma Sun altında kapsam eklerken yapılandırılan Weather.Get yoluna eşleştirin. Değere kapsam adını ("Weather.Get," eklemeyin.

Aşağıdaki örnekler, 11112222-bbbb-3333-cccc-4444dddd5555 Uygulama (İstemci) Kimliği kullanır. Üçüncü örnek contoso.onmicrosoft.com kiracı etki alanını kullanır.

ME-ID kiracı örneği:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Microsoft Entra Dış Kimlik kiracısı:

jwtOptions.Audience = "11112222-bbbb-3333-cccc-4444dddd5555";

AAD B2C kiracı örneği:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Sunucu projesini yapılandırma (BlazorWebAppEntra)

AddMicrosoftIdentityWebApp Microsoft Identity Web'den (Microsoft.Identity.WebNuGet paketi, API belgeleri) projenin BlazorWebAppEntra dosyasında yapılandırılırProgram.

Uygulamanın Entra veya Azure portalındaki kaydından uygulama (istemci) kimliğini, kiracı (yayımcı) etki alanını ve dizin (kiracı) kimliğini alın. Web API'nin kaydından Weather.Get kapsamı için Uygulama Kimliği URI'si elde edilir. Portaldan Uygulama Kimliği URI'sini alırken kapsam adını eklemeyin.

Kimlik doğrulama yapılandırması kiracının türüne bağlıdır:

ME-ID kiracı yapılandırması

Bu bölüm, Microsoft Entra Id veya Azure AAD B2C kiracısında kayıtlı bir uygulama için geçerlidir.

BlazorWebAppEntra Projenin Program dosyasında, Microsoft Identity Web yapılandırmasında aşağıdaki yer tutucuların değerlerini sağlayın:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.Domain = "{DIRECTORY NAME}.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "{TENANT ID}";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

İstek transformatörüne aynı aşağı akış API'sinin kapsamını sağlayın:

List<string> scopes = ["{APP ID URI}/Weather.Get"];

Önceki yapılandırmadaki yer tutucular:

  • {CLIENT ID (BLAZOR APP)}: Uygulama (istemci) kimliği.
  • {DIRECTORY NAME}: Kiracı (yayımcı) etki alanının dizin adı.
  • {TENANT ID}: Kiracı (dizin) kimliği.
  • {BASE ADDRESS}: Web API'sinin temel adresi.
  • {APP ID URI}: Web API'si kapsamları için Uygulama Kimliği URI'si. Aşağıdaki biçimlerden biri kullanılır; burada {CLIENT ID (WEB API)} yer tutucu web API'sinin Entra kaydının İstemci Kimliği, {DIRECTORY NAME} yer tutucu ise kiracı (yayımcılar) etki alanının dizin adıdır (örnek: contoso).
    • ME-ID kiracı formatı: api://{CLIENT ID (WEB API)}
    • B2C kiracı biçimi: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.Domain = "contoso.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = 
            ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Example:

List<string> scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];

Microsoft Entra Dış Kimlik yapılandırması

Bu bölüm, Microsoft Entra Dış Kimlik kiracısında kayıtlı bir uygulama için geçerlidir.

BlazorWebAppEntra Projenin Program dosyasında, Microsoft Identity Web yapılandırmasında aşağıdaki yer tutucuların değerlerini sağlayın:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

İstek transformatörüne aynı aşağı akış API'sinin kapsamını sağlayın:

List<string> scopes = ["{APP ID URI}/Weather.Get"];

Önceki yapılandırmadaki yer tutucular:

  • {DIRECTORY NAME}: Kiracı (yayımcı) etki alanının dizin adı.
  • {CLIENT ID (BLAZOR APP)}: Uygulama (istemci) kimliği.
  • {BASE ADDRESS}: Web API'sinin temel adresi.
  • {APP ID URI}: Web API'si kapsamları için Uygulama Kimliği URI'si. Aşağıdaki biçimlerden biri kullanılır; burada {CLIENT ID (WEB API)} yer tutucu web API'sinin Entra kaydının İstemci Kimliği, {DIRECTORY NAME} yer tutucu ise kiracı (yayımcılar) etki alanının dizin adıdır (örnek: contoso).
    • ME-ID veya Microsoft Entra Harici Kimlik kiracı biçimi: api://{CLIENT ID (WEB API)}
    • B2C kiracı biçimi: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Example:

List<string> scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];

Warning

Üretim uygulamaları, üretim ortamı için dağıtılmış belirteç önbellek sağlayıcısı kullanmalıdır. Aksi takdirde uygulama bazı senaryolarda düşük performansa sahip olabilir. Daha fazla bilgi için Üretim dağıtılmış belirteç önbellek sağlayıcısı kullanma bölümüne bakın.

Geri çağırma yolu (CallbackPath), uygulamayı Entra veya Azure portalına kaydederken yapılandırılan yeniden yönlendirme URI'sine (oturum açma geri çağırma yolu) eşleşmelidir. Uygulamanın kaydının Kimlik Doğrulaması panelinde yollar yapılandırılır. Varsayılan değer, CallbackPath kayıtlı yönlendirme URI'si için /signin-oidc'dir (bağlantı noktası gerekli değildir).

SignedOutCallbackPath, OpenID Connect işleyicisi tarafından uygulamanın temel yolu içinde kesilen istek yoludur ve bu yol üzerinden kullanıcı aracıcısı Entra'dan oturum kapatıldıktan sonra ilk kez geri döndürülür. "/signout-callback-oidc" varsayılan değeri kullanıldığından örnek uygulama yol için bir değer ayarlamaz. İsteği kestikten sonra, OpenID Connect işleyicisi, belirtilmişse, SignedOutRedirectUri'a ya da RedirectUri'e yönlendirir.

Warning

Uygulama gizli dizilerini, bağlantı dizesi'leri, kimlik bilgilerini, parolaları, kişisel kimlik numaralarını (PIN'ler), özel C#/.NET kodunu veya özel anahtarları/belirteçleri her zaman güvenli olmayan istemci tarafı kodunda depolamayın. Test/hazırlama ve üretim ortamlarında, sunucu tarafı Blazor kod ve web API'leri, proje kodu veya yapılandırma dosyalarında kimlik bilgilerinin korunmasını önleyen güvenli kimlik doğrulama akışları kullanmalıdır. Yerel geliştirme testlerinin dışında, ortam değişkenleri en güvenli yaklaşım olmadığından hassas verileri depolamak için ortam değişkenlerinin kullanılmasından kaçınmanızı öneririz. Yerel geliştirme testinde gizli verilerin güvenliğini sağlamak için Gizli Dizi Yöneticisi aracı önerilir. Daha fazla bilgi için bkz . Hassas verileri ve kimlik bilgilerini güvenli bir şekilde koruma.

İstemci gizli anahtarını oluşturma

Bu bölüm yalnızca Blazor Web App sunucu projesi için geçerlidir.

Uygulamaya istemci gizli anahtarını sağlamak için aşağıdaki yaklaşımlardan birini veya her ikisini kullanın.

  • Gizli Dizi Yöneticisi aracı: Gizli Dizi Yöneticisi aracı, özel verileri yerel makinede depolar ve yalnızca yerel geliştirme sırasında kullanılır.
  • Azure Key Vault: İstemci sırrını, yerelde çalışırken Geliştirme ortamı da dahil olmak üzere herhangi bir ortamda kullanılmak üzere bir anahtar kasasında saklayabilirsiniz. Bazı geliştiriciler, test ve canlı dağıtımlar için anahtar kasaları kullanmayı ve yerel geliştirme için Secret Manager aracını kullanmayı tercih eder.

İstemci gizli dizilerini proje kodunda veya yapılandırma dosyalarında depolamaktan kaçınmanızı kesinlikle öneririz. Bu bölümdeki yaklaşımlardan biri veya her ikisi gibi güvenli kimlik doğrulama akışlarını kullanın.

Gizli Yönetici aracı

Gizli Yöneticisi aracı, sunucu uygulamasının istemci gizli anahtarını yapılandırma anahtarı altında depolayabilir.

Blazor Sunucu uygulaması Gizli Yönetici aracı için başlatılmamış. Aşağıdaki komutu yürütmek için Visual Studio'daki Developer PowerShell komut kabuğu gibi bir komut kabuğu kullanın. Komutu çalıştırmadan önce, cd komutuyla dizini sunucu projesinin dizinine değiştirin. Komut, sunucu uygulamasının proje dosyasında uygulama için gizli bilgileri izlemek amacıyla araç tarafından dahili olarak kullanılan bir kullanıcı gizli bilgileri tanımlayıcısı (<UserSecretsId>) oluşturur.

dotnet user-secrets init

İstemci sırrını ayarlamak için aşağıdaki komutu çalıştırın. Yer {SECRET} tutucu, uygulamanın Entra kaydından alınan istemci sırrıdır.

dotnet user-secrets set "AzureAd:ClientSecret" "{SECRET}"

Visual Studio kullanıyorsanız, Çözüm Gezgini'da sunucu projesine sağ tıklayıp Kullanıcı Gizli Dizilerini Yönet'i seçerek gizli dizinin ayarlandığını onaylayabilirsiniz.

Azure Key Vault

Azure Key Vault, uygulamanın istemci gizli anahtarını uygulamaya sağlamanın güvenli bir yaklaşımını sunar.

Anahtar kasası oluşturmak ve bir istemci sırrı ayarlamak için Azure Key Vault gizli dizileri hakkında (Azure belgeleri) sayfasına bakın. Azure Key Vault'u kullanmaya başlamak için kaynaklar arasında bağlantılar sunar. Bu bölümdeki kodu uygulamak için, anahtar kasasını ve gizliyi oluştururken Azure'dan anahtar kasası URI'sini ve gizli adını kaydedin. Bu bölümdeki örnek için gizli ad "BlazorWebAppEntraClientSecret."

Entra veya Azure portalında anahtar kasasını oluştururken:

  • Anahtar kasasını Azure rol tabanlı erişim denetimini (RABC) kullanacak şekilde yapılandırın. Yerel geliştirme ve test de dahil olmak üzere bir Azure Sanal Ağı üzerinde çalışmıyorsanız , Ağ adımında genel erişimin etkinleştirildiğini (işaretli) onaylayın. Genel erişimin etkinleştirilmesi yalnızca anahtar kasası uç noktasını gözler önüne serer. Kimliği doğrulanmış hesaplar hala erişim için gereklidir.

  • Azure Yönetilen Identity oluşturun (veya kullanmayı planladığınız mevcut Yönetilene Identity bir rol ekleyin) ve Key Vault Gizli Anahtar Kullanıcısı rolünü ekleyin. Yönetilen Identity'yi dağıtımı barındıran Azure App Service'e atayın: Ayarlar>Identity>Kullanıcı Tarafından Atanan>Ekle.

    Note

    Azure CLI veya Visual Studio'nun Azure Hizmet Kimlik Doğrulaması'nı kullanarak bir uygulamayı anahtar kasası erişimi için yetkili bir kullanıcıyla yerel olarak çalıştırmayı planlıyorsanız, Key Vault Gizli Dizileri Kullanıcı rolüyle geliştirici Azure kullanıcı hesabınızı Erişim Denetimi'ne (IAM) ekleyin. Azure CLI'yi Visual Studio aracılığıyla kullanmak istiyorsanız, Geliştirici PowerShell panelinden az login komutunu yürüterek kiracı ile kimlik doğrulaması yapmak için istemleri takip edin.

Bu bölümdeki kodu uygulamak için anahtar kasası URI'sini (örnek: "https://contoso.vault.azure.net/", sondaki eğik çizgi gerekiyor) ve anahtar kasasını ve gizli diziyi oluştururken Azure'dan gizli dizi adını (örnek: "BlazorWebAppEntraClientSecret") kaydedin.

Important

Anahtar kasası gizli anahtarı, son kullanma tarihiyle oluşturulur. Anahtar kasası gizli bilgisinin süresinin ne zaman dolacağını izlemeyi ve bu tarihten önce uygulama için yeni bir gizli bilgi oluşturmayı unutmayın.

Sunucu projesine aşağıdaki AzureHelper sınıfını ekleyin. GetKeyVaultSecret yöntemi bir anahtar kasasından gizli veriyi alır. Ad alanını (BlazorSample.Helpers) proje ad alanı düzeninizle eşleşecek şekilde ayarlayın.

Helpers/AzureHelper.cs:

using Azure.Core;
using Azure.Security.KeyVault.Secrets;

namespace BlazorWebAppEntra.Helpers;

public static class AzureHelper
{
    public static string GetKeyVaultSecret(string vaultUri, 
        TokenCredential credential, string secretName)
    {
        var client = new SecretClient(new Uri(vaultUri), credential);
        var secret = client.GetSecretAsync(secretName).Result;

        return secret.Value.Value;
    }
}

Note

Yukarıdaki örnek, Azure barındırma ortamlarında kullanılan kimlik bilgilerini yerel geliştirmede kullanılan kimlik bilgileriyle birleştirerek Azure'a dağıtım yapan uygulamalar geliştirirken kimlik doğrulamasını basitleştirmek için kullanır DefaultAzureCredential . Üretime geçerken, ManagedIdentityCredential gibi bir alternatif daha iyi bir seçenektir. Daha fazla bilgi için bkz. Sistem tarafından atanan yönetilen kimliği kullanarak Azure kaynaklarına Azure tarafından barındırılan .NET uygulamalarının kimliğini doğrulama.

Hizmetlerin sunucu projesinin Program dosyasına kaydedildiği durumlarda, aşağıdaki kodu kullanarak istemci gizli anahtarını alın ve uygulayın.

TokenCredential? credential;

if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };

    credential = new DefaultAzureCredential(options);
}

MicrosoftIdentityOptions ayarlandığında, uygulamanın istemci gizli anahtarını almak ve atamak için GetKeyVaultSecret'i çağırın.

msIdentityOptions.ClientSecret = AzureHelper.GetKeyVaultSecret("{VAULT URI}", 
    credential, "{SECRET NAME}");

{MANAGED IDENTITY CLIENT ID}: Azure Yönetilen Identity İstemci Kimliği (GUID).

{TENANT ID}: Kiracı (dizin) kimliği. Örnek: aaaabbbb-0000-cccc-1111-dddd2222eeee

{VAULT URI}: Anahtar kasası URI'si. URI'nin sonuna eğik çizgiyi ekleyin. Örnek: https://contoso.vault.azure.net/

{SECRET NAME}: Gizli ad. Örnek: BlazorWebAppEntraClientSecret

Yapılandırma, uygulamanın çevresel yapılandırma dosyalarına göre özel anahtar kasaları ve gizli adlar sağlamayı kolaylaştırmak için kullanılır. Örneğin, appsettings.Development.json geliştirme, appsettings.Staging.json hazırlık ve appsettings.Production.json üretim dağıtımı aşamalarında farklı yapılandırma değerleri sağlayabilirsiniz. Daha fazla bilgi için bkz . ASP.NET Core Blazor yapılandırması.

Yalnızca ad ve rol taleplerini seri hale getirme

Program dosyasında, tüm talepler SerializeAllClaimstrue olarak ayarlandığında serileştirilir. Yalnızca CSR için adı ve rol taleplerini seri hale getirilmiş istiyorsanız, seçeneği kaldırın veya false olarak ayarlayın.

JSON yapılandırma sağlayıcısıyla yapılandırma sağlama (uygulama ayarları)

Örnek çözüm projeleri, C# otomatik tamamlama kullanarak yapılandırma ayarlarını bulunabilir hale getirmek için dosyalarında Identity Microsoft Program Web ve JWT taşıyıcı kimlik doğrulamasını yapılandırabilir. Profesyonel uygulamalar genellikle varsayılan JSON yapılandırma sağlayıcısı gibi OIDC seçeneklerini yapılandırmak için bir yapılandırma sağlayıcısı kullanır. JSON yapılandırma sağlayıcısı, yer tutucunun appsettings.json uygulamanın / olduğu uygulama ayarları dosyalarından appsettings.{ENVIRONMENT}.json{ENVIRONMENT}yapılandırmayı yükler. Yapılandırma için uygulama ayarları dosyalarını kullanmak için bu bölümdeki yönergeleri izleyin.

Projenin uygulama ayarları dosyasına (appsettings.json) BlazorWebAppEntra aşağıdaki JSON yapılandırmasını ekleyin:

{
  "AzureAd": {
    "CallbackPath": "/signin-oidc",
    "ClientId": "{CLIENT ID (BLAZOR APP)}",
    "Domain": "{DIRECTORY NAME}.onmicrosoft.com",
    "Instance": "https://login.microsoftonline.com/",
    "ResponseType": "code",
    "TenantId": "{TENANT ID}"
  },
  "DownstreamApi": {
    "BaseUrl": "{BASE ADDRESS}",
    "Scopes": ["{APP ID URI}/Weather.Get"]
  }
}

Önceki yapılandırmadaki yer tutucuları, uygulamanın dosyada kullandığı değerlerle eşleşecek şekilde güncelleştirin Program :

  • {CLIENT ID (BLAZOR APP)}: Uygulama (istemci) kimliği.
  • {DIRECTORY NAME}: Kiracı (yayımcı) etki alanının dizin adı.
  • {TENANT ID}: Kiracı (dizin) kimliği.
  • {BASE ADDRESS}: Web API'sinin temel adresi.
  • {APP ID URI}: Web API'si kapsamları için Uygulama Kimliği URI'si. Aşağıdaki biçimlerden biri kullanılır; burada {CLIENT ID (WEB API)} yer tutucu web API'sinin Entra kaydının İstemci Kimliği, {DIRECTORY NAME} yer tutucu ise kiracı (yayımcılar) etki alanının dizin adıdır (örnek: contoso).
    • ME-ID kiracı formatı: api://{CLIENT ID (WEB API)}
    • B2C kiracı biçimi: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

"AzureAd": {
  "CallbackPath": "/signin-oidc",
  "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "Domain": "contoso.onmicrosoft.com",
  "Instance": "https://login.microsoftonline.com/",
  "ResponseType": "code",
  "TenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
},
"DownstreamApi": {
  "BaseUrl": "https://localhost:7277",
  "Scopes": ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"]
}

Önceki yapılandırmadaki diğer tüm değerleri, dosyada kullanılan özel/varsayılan olmayan değerlerle eşleşecek şekilde güncelleştirin Program .

Yapılandırma, kimlik doğrulama oluşturucusu tarafından otomatik olarak alınır.

Dosyada Program aşağıdaki değişiklikleri yapın:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
-   .AddMicrosoftIdentityWebApp(msIdentityOptions =>
-   {
-       msIdentityOptions.CallbackPath = "...";
-       msIdentityOptions.ClientId = "...";
-       msIdentityOptions.Domain = "...";
-       msIdentityOptions.Instance = "...";
-       msIdentityOptions.ResponseType = "...";
-       msIdentityOptions.TenantId = "...";
-   })
+   .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
-   .AddDownstreamApi("DownstreamApi", configOptions =>
-   {
-       configOptions.BaseUrl = "...";
-       configOptions.Scopes = ["..."];
-   })
+   .AddDownstreamApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
    .AddDistributedTokenCaches();
- List<string> scopes = ["{APP ID URI}/Weather.Get"];
- var accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(scopes);
+ var configuration = transformContext.HttpContext.RequestServices.GetRequiredService<IConfiguration>();
+ var scopes = configuration.GetSection("DownstreamApi:Scopes").Get<IEnumerable<string>>();
+ var accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(scopes ??
+     throw new InvalidOperationException("No downstream API scopes!"));

Note

Üretim uygulamaları, üretim ortamı için dağıtılmış belirteç önbellek sağlayıcısı kullanmalıdır. Aksi takdirde uygulama bazı senaryolarda düşük performansa sahip olabilir. Daha fazla bilgi için Üretim dağıtılmış belirteç önbellek sağlayıcısı kullanma bölümüne bakın.

MinimalApiJwt projesinde, aşağıdaki uygulama ayarları yapılandırmasını appsettings.json dosyasına ekleyin.

"Authentication": {
  "Schemes": {
    "Bearer": {
      "Authority": "https://sts.windows.net/{TENANT ID (WEB API)}",
      "ValidAudiences": ["{APP ID URI (WEB API)}"]
    }
  }
},

Önceki yapılandırmadaki yer tutucuları, uygulamanın dosyada kullandığı değerlerle eşleşecek şekilde güncelleştirin Program :

  • {TENANT ID (WEB API)}: Web API'sinin Kiracı Kimliği.
  • {APP ID URI (WEB API)}: Web API'sinin Uygulama Kimliği URI'si.

Yetkili formatlar aşağıdaki kalıpları benimser.

  • ME-ID kiracı türü: https://sts.windows.net/{TENANT ID}
  • Microsoft Entra Dış Kimliği: https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0
  • B2C kiracı türü: https://login.microsoftonline.com/{TENANT ID}/v2.0

İzleyici biçimleri aşağıdaki desenleri benimser ({CLIENT ID} web API'sinin İstemci Kimliğidir; {DIRECTORY NAME} örneğin, dizin adıdır): contoso

  • ME-ID kiracı türü: api://{CLIENT ID}
  • Microsoft Entra Dış Kimliği: {CLIENT ID}
  • B2C kiracı türü: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}

Yapılandırma, JWT taşıyıcı kimlik doğrulama oluşturucusu tarafından otomatik olarak alınır.

Dosyadan Program aşağıdaki satırları kaldırın:

- jwtOptions.Authority = "...";
- jwtOptions.Audience = "...";

Yapılandırma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Üretim ortamında dağıtılmış belirteç önbellek sağlayıcısını kullanın

Dağıtılmış belirteç önbelleğe alma için kullanılabilir bir temel uygulama olduğundan emin olmak için çağrı AddDistributedTokenCaches yapılırken bellek içi dağıtılmış belirteç önbellekleri oluşturulur.

Üretim web uygulamaları ve web API'leri bir üretim dağıtılmış belirteç önbelleği kullanmalıdır (örneğin: Redis, Microsoft SQL Server, Microsoft Azure Cosmos DB).

Note

Tek bir makinede yerel geliştirme ve test için dağıtılmış belirteç önbellekleri yerine bellek içi belirteç önbelleklerini kullanabilirsiniz:

builder.Services.AddInMemoryTokenCaches();

Geliştirme ve test sürecinin ilerleyen bölümlerinde, dağıtılmış üretim belirteç önbellek sağlayıcısı kullanın.

AddDistributedMemoryCache, Microsoft Web tarafından IDistributedCache için belirteç önbelleğe alma işlemi sırasında kullanılan, önbellek öğelerini bellekte depolayan varsayılan bir Identity uygulaması ekler.

Dağıtılmış belirteç önbelleği, MsalDistributedTokenCacheAdapterOptions ile yapılandırılır.

builder.Services.AddDistributedMemoryCache();

builder.Services.Configure<MsalDistributedTokenCacheAdapterOptions>(
    options => 
    {
      // The following lines that are commented out reflect
      // default values. We recommend overriding the default
      // value of Encrypt to encrypt tokens at rest.

      //options.DisableL1Cache = false;
      //options.L1CacheOptions.SizeLimit = 500 * 1024 * 1024;
      options.Encrypt = true;
      //options.SlidingExpiration = TimeSpan.FromHours(1);
    });

AddDistributedMemoryCache NuGet paketine Microsoft.Extensions.Caching.Memory bir paket başvurusu gerektirir.

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.

Üretim dağıtılmış önbellek sağlayıcısını yapılandırmak için bkz. ASP.NET Core'da dağıtılmış önbelleğe alma.

Warning

Uygulamayı üretim ortamına dağıtırken her zaman bellek içi dağıtılmış belirteç önbelleklerini gerçek bir belirteç önbellek sağlayıcısıyla değiştirin. Bir üretim dağıtılmış belirteci önbellek sağlayıcısını benimsemezseniz uygulama önemli ölçüde düşük performansa maruz kalabilir.

Daha fazla bilgi için bkz . Belirteç önbelleği serileştirme: Dağıtılmış önbellekler. Ancak, gösterilen kod örnekleri, dağıtılmış önbellekleri AddDistributedMemoryCache yerine AddDistributedTokenCache aracılığıyla yapılandıran ASP.NET Core uygulamaları için geçerli değildir.

Üretimde paylaşılan bir Data Protection anahtar halkası kullanın, böylece bir web grubundaki sunucular arasında uygulamanın örnekleri MsalDistributedTokenCacheAdapterOptions.Encrypt ayarlandığında belirteçlerin true şifresini çözebilir.

Note

Erken geliştirme ve tek bir makinede yerel test için Encrypt öğesini false olarak ayarlayabilir ve daha sonra paylaşılan bir Veri Koruma anahtar halkasını yapılandırabilirsiniz.

options.Encrypt = false;

Geliştirme ve test döneminin ilerleyen bölümlerinde belirteç şifrelemesini etkinleştirin ve paylaşılan bir Data Protection anahtar halkasını benimseyin.

Aşağıdaki örnekte, paylaşılan anahtar halkası için Azure Blob Depolama ve Azure Key Vault'un (PersistKeysToAzureBlobStorage/ProtectKeysWithAzureKeyVault) nasıl kullanılacağı gösterilmektedir. Hizmet yapılandırmaları, gösterim amacıyla temel durum senaryolarıdır. Üretim uygulamalarını dağıtmadan önce Azure hizmetleri hakkında bilgi edinin ve bu bölümün sonunda bağlantılı olan Azure hizmetlerinin ayrılmış belge kümelerini kullanarak en iyi yöntemleri benimseyin.

sunucu projesinde Blazor Web Appaşağıdaki paketlerin varlığını onaylayın:

Note

.NET uygulamalarına paket ekleme yönergeleri için Paket tüketimi iş akışı (NuGet belgeleri) sayfasındaki Paketleri yükleme ve yönetme altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.

Note

Aşağıdaki adımlara devam etmeden önce uygulamanın Microsoft Entra'ya kaydedildiğini onaylayın.

Bir üretim dağıtılmış belirteç önbellek sağlayıcısı uygulandığında, aşağıdaki kod genellikle aynı anda uygulanır. Hem Azure içinde hem de Azure dışında bulunan diğer seçenekler birden çok uygulama örneğinde veri koruma anahtarlarını yönetmek için kullanılabilir, ancak örnek uygulama Azure hizmetlerinin nasıl kullanılacağını gösterir.

Veri koruma anahtarlarını korumak için Azure Blob Depolama'yı yapılandırın. ASP.NET Core'daki Anahtar depolama sağlayıcıları'ndaki yönergeleri izleyin.

Azure Key Vault'ı, durağan haldeki veri koruma anahtarlarını şifreleyecek şekilde yapılandırın. ASP.NET Çekirdek Veri Korumasını Yapılandırma'daki yönergeleri izleyin.

Hizmetlerin kaydedildiği dosyada Program aşağıdaki kodu kullanın:

TokenCredential? credential;

if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };

    credential = new DefaultAzureCredential(options);
}

builder.Services.AddDataProtection()
    .SetApplicationName("BlazorWebAppEntra")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential)
    .ProtectKeysWithAzureKeyVault(new Uri("{KEY IDENTIFIER}"), credential);

Herhangi bir uygulama adını SetApplicationName'ye geçirebilirsiniz. Tüm uygulama dağıtımlarının aynı değeri kullandığını sadece onaylayın.

{MANAGED IDENTITY CLIENT ID}: Azure Yönetilen Identity İstemci Kimliği (GUID).

{TENANT ID}: Kiracı Kimliği.

{BLOB URI}: Anahtar dosyasının tam URI'si. URI, anahtar dosyasını oluşturduğunuzda Azure Depolama tarafından oluşturulur. SAS kullanmayın.

{KEY IDENTIFIER}: Anahtar şifrelemesi için kullanılan Azure Key Vault anahtar tanımlayıcısı. Bir erişim ilkesi, uygulamanın Get, Unwrap Key ve Wrap Key izinleriyle anahtar kasasına erişmesini sağlar. Anahtarın sürümü, oluşturulduktan sonra Entra veya Azure portalındaki anahtardan alınır. Anahtar kasası anahtarının otomatik döndürülmesini etkinleştirirseniz, uygulamanın anahtar kasası yapılandırmasında, tanımlayıcının sonuna anahtar GUID'inin yerleştirilmediği, sürüm numarası bulunmayan bir anahtar tanımlayıcısı kullandığınızdan emin olun (örnek: https://contoso.vault.azure.net/keys/data-protection).

Note

Üretim dışı ortamlarda, önceki örnek Azure barındırma ortamlarında kullanılan kimlik bilgilerini yerel geliştirmede kullanılan kimlik bilgileriyle birleştirerek Azure'a dağıtım yapan uygulamalar geliştirirken kimlik doğrulamasını basitleştirmek için kullanır DefaultAzureCredential . Daha fazla bilgi için bkz. Sistem tarafından atanan yönetilen kimliği kullanarak Azure kaynaklarına Azure tarafından barındırılan .NET uygulamalarının kimliğini doğrulama.

Alternatif olarak, JSON Yapılandırma Sağlayıcısı'nı kullanarak uygulamayı uygulama ayarları dosyalarından değerleri sağlayacak şekilde yapılandırabilirsiniz. Uygulama ayarları dosyasına aşağıdakileri ekleyin:

"DistributedTokenCache": {
  "DisableL1Cache": false,
  "L1CacheSizeLimit": 524288000,
  "Encrypt": true,
  "SlidingExpirationInHours": 1
},
"DataProtection": {
  "BlobUri": "{BLOB URI}",
  "KeyIdentifier": "{KEY IDENTIFIER}"
}

Örnek DataProtection bölüm:

"DataProtection": {
  "BlobUri": "https://contoso.blob.core.windows.net/data-protection/keys.xml",
  "KeyIdentifier": "https://contoso.vault.azure.net/keys/data-protection"
}

Note

Önceki örnekteki anahtar tanımlayıcısı sürümsüzdür. Tanımlayıcının sonunda bir GUID anahtar sürümü yok. Anahtar için otomatik anahtar döndürmeyi yapılandırmayı tercih ederseniz bu özellikle önemlidir. Daha fazla bilgi için bkz. Azure Key Vault'ta şifreleme anahtarı otomatik döndürmeyi yapılandırma: Anahtar döndürme ilkesi.

Dosyada Program aşağıdaki değişiklikleri yapın:

builder.Services.Configure<MsalDistributedTokenCacheAdapterOptions>(
    options =>
    {
+       var config = builder.Configuration.GetSection("DistributedTokenCache");

-       options.DisableL1Cache = false;
+       options.DisableL1Cache = config.GetValue<bool>("DisableL1Cache");

-       options.L1CacheOptions.SizeLimit = 500 * 1024 * 1024;
+       options.L1CacheOptions.SizeLimit = config.GetValue<long>("L1CacheSizeLimit");

-       options.Encrypt = true;
+       options.Encrypt = config.GetValue<bool>("Encrypt");

-       options.SlidingExpiration = TimeSpan.FromHours(1);
+       options.SlidingExpiration = 
+           TimeSpan.FromHours(config.GetValue<int>("SlidingExpirationInHours"));
    });

- builder.Services.AddDataProtection()
-     .SetApplicationName("BlazorWebAppEntra")
-     .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential)
-     .ProtectKeysWithAzureKeyVault(new Uri("{KEY IDENTIFIER}"), credential);

Dosyanın içinde hizmetlerin yapılandırıldığı Program yere aşağıdaki kodu ekleyin:

var config = builder.Configuration.GetSection("DataProtection");

builder.Services.AddDataProtection()
    .SetApplicationName("BlazorWebAppEntra")
    .PersistKeysToAzureBlobStorage(
        new Uri(config.GetValue<string>("BlobUri") ??
        throw new Exception("Missing Blob URI")),
        credential)
    .ProtectKeysWithAzureKeyVault(
        new Uri(config.GetValue<string>("KeyIdentifier") ?? 
        throw new Exception("Missing Key Identifier")), 
        credential);

Paylaşılan Data Protection anahtar halkası ve anahtar depolama sağlayıcıları kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

YARP ileticisi hedef ön eki

Blazor Web App Kullanıcının erişim belirtecinin web API çağrısına eklendiği sunucu projesinin MinimalApiJwt YARP ileticisi, hedef ön ekini https://weatherapibelirtir. Bu değer, AddProject projesinin Program dosyasına geçirilen Aspire.AppHost proje adıyla eşleşir.

Sunucu projesinde Blazor Web App iletici (BlazorWebAppEntra):

app.MapForwarder("/weather-forecast", "https://weatherapi", transformBuilder =>
{
    ...
}).RequireAuthorization();

Program Uygulama Konağı projesinin (Aspire) dosyasındaki proje adının eşleşmesi:

var weatherApi = builder.AddProject<Projects.MinimalApiJwt>("weatherapi");

YARP ileticisini üretime dağıtırken, hedef ön ekini Blazor Web App değiştirmenize gerek yoktur. Microsoft Identity Web Alt Akış API paketi, YARP ileticisinin hedef ön ekini değil, ServerWeatherForecaster içinden web API çağrısı yapmak amacıyla yapılandırma üzerinden geçirilen temel URI'yi kullanır. Üretimde YARP ileticisi yalnızca isteği dönüştürerek kullanıcının erişim belirtecini ekler.

Oturumu kapatmada giriş sayfasına yeniden yönlendirme

LogInOrOut bileşeni (Layout/LogInOrOut.razor), dönüş URL'si (ReturnUrl) için gizli bir alanı geçerli URL'ye (currentURL) ayarlar. Kullanıcı uygulama oturumunu kapattığında, kimlik sağlayıcısı kullanıcıyı oturumu kapattığı sayfaya döndürür. Kullanıcı güvenli bir sayfadan oturum açarsa, aynı güvenli sayfaya döndürülür ve kimlik doğrulama işlemi aracılığıyla geri gönderilir. Kullanıcıların hesapları düzenli olarak değiştirmesi gerektiğinde bu kimlik doğrulama akışı makuldür.

Çıkış yaparken dönüş URL'si sağlamayan aşağıdaki LogInOrOut bileşenini alternatif olarak kullanın.

Layout/LogInOrOut.razor:

<div class="nav-item px-3">
    <AuthorizeView>
        <Authorized>
            <form action="authentication/logout" method="post">
                <AntiforgeryToken />
                <button type="submit" class="nav-link">
                    <span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true">
                    </span> Logout
                </button>
            </form>
        </Authorized>
        <NotAuthorized>
            <a class="nav-link" href="authentication/login">
                <span class="bi bi-person-badge-nav-menu" aria-hidden="true"></span>
                Login
            </a>
        </NotAuthorized>
    </AuthorizeView>
</div>

Hava durumu veri güvenliği

Bu uygulamanın hava durumu verilerini nasıl güvenli hale getirdiği hakkında daha fazla bilgi için, Etkileşimli Otomatik işlemeyle Blazor Web App'lerdeVerilerini Güvene Alma konusuna bakın.

Troubleshoot

Logging

Sunucu uygulaması standart bir ASP.NET Core uygulamasıdır. Sunucu uygulamasında daha düşük bir günlüğe kaydetme düzeyi etkinleştirmek için ASP.NET Core günlüğe kaydetme kılavuzuna başvurun.

Kimlik doğrulaması için hata ayıklama veya izleme günlüğünü etkinleştirmek amacıyla, makale sürümü seçicisini .NET 7 veya sonraki sürümlerde ASP.NET Core olarak ayarlayarak, ASP.NET Core Blazor WebAssembly günlüğününBlazor bölümüne bakın.

Yaygın hatalar

  • Hata ayıklayıcısı, Microsoft Entra Dış Kimliği ile oturumu kapatma sırasında bir özel durumda kesintiye uğruyor

    Aşağıdaki özel durum , Microsoft Entra Dış Kimliği ile oturum kapatma sırasında Visual Studio hata ayıklayıcısını durdurur:

    Uncaught TypeError TypeError: Failed to execute 'postMessage' on 'Window': The provided value cannot be converted to a sequence.

    Oturum kapatma sırasında JavaScript özel durumu için Visual Studio Hata Ayıklayıcısı hatası

    Özel durum Entra JavaScript kodundan oluşturulur, bu nedenle bu ASP.NET Core ile ilgili bir sorun değildir. Özel durum üretimdeki uygulama işlevselliğini etkilemez, bu nedenle özel durum yerel geliştirme testi sırasında yoksayılabilir.

  • Uygulamanın veya Identity Sağlayıcının (IP) yanlış yapılandırılması

    En yaygın hatalar yanlış yapılandırmadan kaynaklanıyor. Aşağıda birkaç örnek verilmiştir:

    • Senaryonun gereksinimlerine bağlı olarak, eksik veya yanlış bir Yetkili, Örnek, Kiracı Kimliği, Kiracı etki alanı, İstemci Kimliği veya Yeniden Yönlendirme URI'si bir uygulamanın istemcilerin kimliğini doğrulamasını engeller.
    • Yanlış istek kapsamları istemcilerin sunucu web API'leri uç noktalarına erişmesini engeller.
    • Hatalı veya eksik sunucu API'si izinleri istemcilerin sunucu web API'si uç noktalarına erişmesini engeller.
    • Uygulamayı, IP adresinin uygulama kaydında Yeniden Yönlendirme URI'sinde yapılandırılmış olandan farklı bir bağlantı noktasında çalıştırma. Microsoft Entra Kimliği ve bir localhost geliştirme testi adresinde çalışan uygulama için bir bağlantı noktası gerekli değildir, ancak localhost dışındaki adresler için, uygulamanın bağlantı noktası yapılandırması ile uygulamanın çalıştığı bağlantı noktası eşleşmelidir.

    Bu makaledeki yapılandırma kapsamı, doğru yapılandırmanın örneklerini gösterir. Yapılandırmayı dikkatle denetleyin ve uygulama ile IP yanlış yapılandırma hatalarını arayın.

    Yapılandırma doğru görünüyorsa:

    • Uygulama günlüklerini analiz edin.

    • tarayıcının geliştirici araçlarıyla istemci uygulaması ile IP veya sunucu uygulaması arasındaki ağ trafiğini inceleyin. Genellikle, soruna neyin neden olduğuna dair ipucu içeren tam bir hata iletisi veya ileti, istekte bulunduktan sonra IP veya sunucu uygulaması tarafından istemciye döndürülür. Geliştirici araçları kılavuzu aşağıdaki makalelerde bulunur:

    Belge ekibi makalelerdeki belge geri bildirimlerine ve hatalarına yanıt verir (Bu sayfa geri bildirimi bölümünden bir sorun açın) ancak ürün desteği sağlayamaz. Bir uygulamada sorun gidermeye yardımcı olmak için çeşitli genel destek forumları mevcuttur. Aşağıdakileri öneririz:

    Önceki forumlar Microsoft'a ait değildir veya microsoft tarafından denetlenmemektedir.

    Güvenlikle ilgili olmayan, hassas olmayan ve gizli olmayan yeniden üretilebilir çerçeve hata raporları için ASP.NET Core ürün birimiyle ilgili bir sorun açın. Sorunun nedenini ayrıntılı bir şekilde araştırıp kendi başınıza ve bir genel destek forumundaki topluluğun yardımıyla çözene kadar ürün birimiyle ilgili bir sorun açmayın. Ürün birimi, basit yanlış yapılandırma veya üçüncü taraf hizmetleri içeren kullanım örnekleri nedeniyle bozulan tek tek uygulamalarda sorun gideremez. Bir rapor doğası gereği hassas veya gizliyse veya siber saldırganların yararlanabileceği üründe olası bir güvenlik açığını açıklıyorsa bkz . Güvenlik sorunlarını ve hatalarını raporlama (dotnet/aspnetcore GitHub deposu).

  • ME-ID için yetkisiz istemci

    bilgi: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Yetkilendirme başarısız oldu. Bu gereksinimler karşılanmadı: DenyAnonymousAuthorizationRequirement: Kimliği doğrulanmış bir kullanıcı gerektirir.

    ME-ID'den oturum açma geri çağırma hatası:

    • Hata: unauthorized_client
    • Açıklama: AADB2C90058: The provided application is not configured to allow public clients.

    Hatayı düzeltmek için:

    1. Azure portalında uygulamanın bildirimine erişin.
    2. özniteliğini allowPublicClient veya nullolarak true ayarlayın.

Çerezler ve site verileri

Tanımlama bilgileri ve site verileri uygulama güncelleştirmeleri arasında kalıcı olabilir ve test ve sorun gidermeyi etkileyebilir. Uygulama kodu değişiklikleri, sağlayıcıyla kullanıcı hesabı değişiklikleri veya sağlayıcı uygulaması yapılandırma değişiklikleri yaparken aşağıdakileri temizleyin:

  • Kullanıcı oturum tanımlama bilgileri
  • Uygulama tanımlama bilgileri
  • Önbelleğe alınan ve depolanan site verileri

Kalan tanımlama bilgilerinin ve site verilerinin test ve sorun gidermeye engel olmasını önlemeye yönelik bir yaklaşım:

  • Tarayıcı yapılandırma
    • Tarayıcı her kapatıldığında tüm cookie ve site verilerini silmek üzere yapılandırabileceğiniz test için bir tarayıcı kullanın.
    • Uygulama, test kullanıcısı veya sağlayıcı yapılandırmasında yapılan herhangi bir değişiklik için tarayıcının el ile veya IDE tarafından kapatıldığını doğrulayın.
  • Visual Studio'da InPrivate veya Gizli modda tarayıcı açmak için özel bir komut kullanın:
    • Visual Studio'nun Çalıştır düğmesinden Gözat iletişim kutusunu açın.
    • Ekle düğmesini seçin.
    • Program alanında tarayıcınızın yolunu belirtin. Aşağıdaki yürütülebilir yollar Windows 10 için tipik yükleme konumlarıdır. Tarayıcınız farklı bir konumda yüklüyse veya Windows 10 kullanmıyorsanız, tarayıcının yürütülebilir dosyasının yolunu sağlayın.
      • Microsoft Edge: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Bağımsız Değişkenler alanında, tarayıcının InPrivate veya Gizli (Incognito) modunda açılması için kullandığı komut satırı seçeneğini belirtin. Bazı tarayıcılar uygulamanın URL'sini gerektirir.
      • Microsoft Edge: -inprivate'yi kullanın.
      • Google Chrome: URL açmak için --incognito --new-window {URL} kullanın. {URL} yer tutucusu açılacak olan URL’yi temsil eder (örneğin, https://localhost:5001).
      • Mozilla Firefox: `-private -url {URL}` şunlar için kullanılır: `{URL}`, açılacak olan URL (örneğin, `https://localhost:5001`).
    • Kolay ad alanına bir ad girin. Örneğin, Firefox Auth Testing.
    • Tamam düğmesini seçin.
    • Bir uygulamayla yapılan her test yinelemesi için tarayıcı profilini seçmek zorunda kalmamak için Varsayılan Olarak Ayarla düğmesiyle profili varsayılan olarak ayarlayın.
    • Uygulama, test kullanıcısı veya sağlayıcı yapılandırmasında yapılan herhangi bir değişiklik için tarayıcının IDE tarafından kapatıldığını doğrulayın.

Uygulama yükseltmeleri

Çalışan bir uygulama, geliştirme makinesindeki .NET SDK'sını yükselttikten veya uygulama içindeki paket sürümlerini değiştirdikten hemen sonra başarısız olabilir. Bazı durumlarda, tutarsız paketler ana yükseltmeler yaparken bir uygulamayı bozabilir. Bu sorunların çoğu şu yönergeleri izleyerek düzeltilebilir:

  1. Bir komut kabuğunda dotnet nuget locals all --clear çalıştırarak yerel sistemin NuGet paket önbelleklerini temizleyin.
  2. Proje bin ve obj klasörlerini silin.
  3. Projeyi geri yükleyin ve yeniden oluşturun.
  4. Uygulamayı yeniden dağıtmadan önce sunucudaki dağıtım klasöründeki tüm dosyaları silin.

Note

Uygulamanın hedef çerçevesiyle uyumlu olmayan paket sürümlerinin kullanımı desteklenmez. Paket hakkında bilgi için NuGet Gallerykullanın.

Çözümü doğru projeden başlatma

Blazor Web Appsaniye:

  • Backend-for-Frontend (BFF) tasarım desen örneklerinden biri için çözümü Aspire/Aspire.AppHost projesinden başlatın.
  • BFF olmayan desen örneklerinden biri için çözümü sunucu projesinden başlatın.

Blazor Server:

Çözümü sunucu projesinden başlatın.

Kullanıcıyı inceleme

Aşağıdaki UserClaims bileşen doğrudan uygulamalarda kullanılabilir veya daha fazla özelleştirme için temel olarak kullanılabilir.

UserClaims.razor:

@page "/user-claims"
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]

<PageTitle>User Claims</PageTitle>

<h1>User Claims</h1>

@if (claims.Any())
{
    <ul>
        @foreach (var claim in claims)
        {
            <li><b>@claim.Type:</b> @claim.Value</li>
        }
    </ul>
}

@code {
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

    [CascadingParameter]
    private Task<AuthenticationState>? AuthState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (AuthState == null)
        {
            return;
        }

        var authState = await AuthState;
        claims = authState.User.Claims;
    }
}

Ek kaynaklar