Aracılığıyla paylaş


OpenID Connect (OIDC) ile bir ASP.NET Çekirdeğinin Blazor Web App güvenliğini sağlama

Note

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 10 sürümüne bakın.

Bu makalede, GitHub deposunda (.NET 8 veya üzeri) örnek bir uygulamaBlazor Web App kullanarak dotnet/blazor-samples ile güvenli hale getirmek (nasıl indirilir) açıklanmaktadır.

Microsoft Entra Id veya Azure AD B2C için, hem OIDC hem de kimlik doğrulama işleyicilerini uygun varsayılanlarla ekleyen Microsoft AddMicrosoftIdentityWebApp Web'denIdentity(, Microsoft.Identity.Web) kullanabilirsiniz. Bu makaledeki örnek uygulama ve yönergeler Microsoft Identity Web'i kullanmaz. Kılavuzda, OIDC işleyicisinin herhangi bir OIDC sağlayıcısı için el ile nasıl yapılandırılır gösterilmektedir. Microsoft Identity Web'i uygulama hakkında daha fazla bilgi için, Microsoft Entra ID ile bir ASP.NET Core'u Blazor Web App güvence altına almak başlıklı bölüme bakın.

Makalenin bu sürümü, genel Etkileşimli Otomatik işlemeyi (sunucu ve projeler) benimseyen bir uygulamayla .Client benimsemeden OIDC'yi uygulamayı kapsar. 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 özellik benimsenmiştir:

  • Blazor Web App küresel etkileşim ile Otomatik işleme modunu kullanır.
  • Özel kimlik doğrulama durumu sağlayıcı hizmetleri, sunucu ve istemci uygulamaları tarafından kullanıcının kimlik doğrulama durumunu yakalamak ve sunucu ile istemci arasında akış yapmak için kullanılır.
  • Bu uygulama, herhangi bir OIDC kimlik doğrulama akışı için bir başlangıç noktasıdır. OIDC, uygulamada el ile yapılandırılır ve Microsoft Entra Kimliği'ne veya Microsoft Identity Web paketlerine dayanmaz ve örnek uygulama Için Microsoft Azure barındırma gerekmez. Ancak örnek uygulama Entra, Microsoft Identity Web ile kullanılabilir ve Azure'da barındırılabilir.
  • Otomatik etkileşimli olmayan belirteç yenileme.
  • Ayrı bir web API'si projesi, hava durumu verileri için güvenli bir web API çağrısı gösterir.

Tr-TR: .NET için Microsoft Kimlik Doğrulama Kitaplığı, Microsoft Identity Web ve Microsoft Entra ID kullanılarak alternatif bir deneyim için bkz. Microsoft Entra ID ile ASP.NET Core'un Blazor Web App güvenliğini sağlama.

Örnek çözüm

Örnek uygulama aşağıdaki projelerden oluşur:

  • BlazorWebAppOidc: Blazor Web App öğesinin, hava durumu verileri için bir Minimal API uç noktası örneği içeren sunucu tarafı projesi.
  • BlazorWebAppOidc.Client: Blazor Web App için istemci tarafı projesi.
  • MinimalApiJwt: Hava durumu verileri için Minimum API uç noktası içeren arka uç web API'si.

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 8 veya sonraki bir sürümün klasöründedir BlazorWebAppOidc .

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

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

Örnek çözüm özellikleri:

  • Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.

  • Hava durumu verileri, /weather-forecast projesinin Program dosyasındaki Program.cs minimal API uç noktası (MinimalApiJwt) tarafından işlenir. Uç nokta, çağrısı RequireAuthorizationyaparak yetkilendirme gerektirir. Projeye eklediğiniz tüm denetleyiciler için özniteliği denetleyiciye veya eyleme [Authorize] ekleyin. Bir yetkilendirme ilkesi aracılığıyla uygulama genelinde yetkilendirme gerektirme ve genel uç noktaların bir alt kümesinde yetkilendirmeyi geri çevirme hakkında daha fazla bilgi için Sayfalar OIDC kılavuzunaRazor bakın.

  • Uygulama, hava durumu verileri için bir web API'sini güvenli bir şekilde çağırır:

    • Bileşen Weather, sunucuda işlenirken, sunucuya ait ServerWeatherForecaster öğesiyle, MinimalApiJwt projesindeki web API'den hava durumu verilerini almak için DelegatingHandler (TokenHandler) kullanır ve bu da HttpContext'den gelen erişim belirtecini isteğe ekler.
    • Bileşen istemcide işlendiğinde, bileşen, sunucu projesinin ClientWeatherForecaster dosyasından web API çağrısı yapmak için hizmet uygulaması olarak HttpClient'ı kullanır. Bu hizmet uygulaması, istemci projesinin Program dosyasında önceden yapılandırılmış ServerWeatherForecaster'i kullanır.
  • PersistingAuthenticationStateProvider sınıfı (PersistingAuthenticationStateProvider.cs), kimlik doğrulama durumunu istemciye aktarmak için AuthenticationStateProvider kullanan sunucu tarafı bir PersistentComponentState olup, daha sonra WebAssembly uygulamasının ömrü boyunca sabit kalır.

'de Blazor Web Apphizmet soyutlamaları kullanan (web) API çağrıları hakkında daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamasından web API'sini çağırma.

OIDC sağlayıcı terminolojisi ve kılavuzu

Örnek uygulamayı ve bu makaledeki yönergeleri kullanmak için OIDC sağlayıcısı olarak Microsoft Entra'yı (ME-ID) benimsemeniz gerekmiyor olsa da, bu makalede Microsoft belgelerinde ve Azure/Entra portallarında bulunan adları kullanan ME-ID ayarları açıklanmaktadır. OIDC ayarları, OIDC sağlayıcıları arasında benzer adlandırmaya sahiptir. Üçüncü taraf OIDC sağlayıcısı kullanırken, uygulama ve web API kayıtları için bu makaledeki yönergelerle birlikte sağlayıcının belgelerini kullanın.

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 BlazorWebAppOidc 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.

Uygulama ve web API'si kayıt kılavuzu için bkz. Microsoft Entra Id'de uygulama kaydetme.

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ı (BlazorWebAppOidc/BlazorWebApOidc.Client) Web platformu yapılandırmasına ve Yeniden Yönlendirme URI'sinehttps://localhost/signin-oidc (bağlantı noktası gerekmez) kaydedin. Uygulamanın kiracı kimliği ve istemci kimliği ile birlikte web API'sinin temel adresi, Uygulama Kimliği URI'si ve hava durumu kapsamı adı, uygulamayı Program 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.

İstemci gizli anahtarını oluşturma

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

Warning

Uygulama gizli dizilerini, bağlantı dizelerini, 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.

Yerel geliştirme testi için, sunucu projesinin istemci gizli dizisini yapılandırma anahtarı Blazoraltında depolamak için Authentication:Schemes:MicrosoftOidc:ClientSecret kullanın.

Sunucu Blazor projesi Gizli Yönetici aracı için başlatılmadı. Aşağıdaki komutu yürütmek için Visual Studio'daki Developer PowerShell komut kabuğu gibi bir komut kabuğu kullanın. Komutunu yürütmeden önce, komutuyla dizinini cd sunucu projesinin dizinine değiştirin. komutu bir kullanıcı gizli dizi tanımlayıcısı oluşturur (<UserSecretsId> sunucu uygulamasının proje dosyasında):

dotnet user-secrets init

İstemci gizli dizisini ayarlamak için aşağıdaki komutu yürütür. Yer {SECRET} tutucu, uygulamanın kaydından alınan istemci gizli dizisidir:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

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

MinimalApiJwt proje

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.

Proje, Geliştirme ortamında OpenAPI belgeleri ve Swagger kullanıcı arabirimi oluşturmak için paketler ve yapılandırma içerir. Daha fazla bilgi için bkz. Oluşturulan OpenAPI belgelerini kullanma.

Proje, hava durumu verileri için minimum API uç noktası oluşturur:

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();

Projenin JwtBearerOptions dosyasındaki AddJwtBearer çağrısının Program bölümünde projeyi yapılandırın.

Authority OIDC çağrıları yapmak için Yetkilendirme'yi ayarlar. Proje için MinimalApiJwt ayrı bir uygulama kaydı kullanmanızı öneririz. Yetkilendirme, kimlik sağlayıcısı tarafından döndürülen JWT'nin düzenleyicisiyle (iss) eşleşir.

jwtOptions.Authority = "{AUTHORITY}";

Yetki Biçimi, kullanılan kiracının türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeeekullanılır.

ME-ID kiracı yetkilisi örneği:

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

AAD B2C kiracı yetkilisi örneği:

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

Audience alınan OIDC belirtecinin Hedef Kitlesini ayarlar.

jwtOptions.Audience = "{APP ID URI}";

Note

Microsoft Entra Id kullanırken, değeri yalnızca Entra veya Azure portalında API'yi kullanıma sunma altında kapsam eklerken Weather.Get yapılandırılan Uygulama Kimliği URI'sinin yolu ile eşleştirin. Değere kapsam adını ("Weather.Get," eklemeyin.

Hedef kitlenin formatı, kullanılan kiracı türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği contoso ve İstemci Kimliği 11112222-bbbb-3333-cccc-4444dddd5555kullanılır.

ME-ID kiracı Uygulama Kimliği URI örneği:

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

AAD B2C kiracı uygulama kimliği URI örneği:

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

Blazor Web App sunucu projesi (BlazorWebAppOidc)

BlazorWebAppOidc projesi, Blazor Web App projesinin sunucu tarafıdır.

A DelegatingHandler (TokenHandler) kullanıcının erişim belirtecini giden isteklere eklemeyi yönetir. Belirteç işleyicisi yalnızca statik sunucu tarafı işleme (statik SSR) sırasında yürütülür, bu nedenle kullanımı HttpContext bu senaryoda güvenlidir. Daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamalarında IHttpContextAccessor/HttpContext ve ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

TokenHandler.cs:

public class TokenHandler(IHttpContextAccessor httpContextAccessor) : 
    DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (httpContextAccessor.HttpContext is null)
        {
            throw new Exception("HttpContext not available");
        }

        var accessToken = await httpContextAccessor.HttpContext
            .GetTokenAsync("access_token");

        request.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", accessToken);

        return await base.SendAsync(request, cancellationToken);
    }
}

Projenin Program dosyasında belirteç işleyicisi (TokenHandler), hizmet olarak kaydedilir ve AddHttpMessageHandler ("MinimalApiJwt") kullanarak arka uç web API'sine güvenli istekler göndermek için ile ExternalApi ileti işleyicisi olarak belirtilir.

builder.Services.AddScoped<TokenHandler>();

builder.Services.AddHttpClient("ExternalApi",
      client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ?? 
          throw new Exception("Missing base address!")))
      .AddHttpMessageHandler<TokenHandler>();

Projenin appsettings.json dosyasında dış API URI'sini yapılandırın:

"ExternalApiUri": "{BASE ADDRESS}"

Example:

"ExternalApiUri": "https://localhost:7277"

OpenIdConnectOptions Aşağıdaki yapılandırma, çağrısında Programprojenin AddOpenIdConnect dosyasında bulunur:

PushedAuthorizationBehavior: Gönderilen Yetkilendirme İstekleri (PAR) desteğini denetler. Varsayılan olarak, kimlik sağlayıcısının bulma belgesinin (genellikle adresinde .well-known/openid-configurationbulunur) PAR desteği tanıtıyorsa, bu ayar PAR kullanmaktır. Uygulama için PAR desteğine ihtiyaç duyarsanız değerini atayabilirsiniz PushedAuthorizationBehavior.Require. PAR, Microsoft Entra tarafından desteklenmez ve Entra'nın gelecekte desteklemesi için bir plan yoktur.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Başarılı bir kimlik doğrulamasından sonra kullanıcının kimliğini kalıcı hale getirmekle sorumlu ara yazılıma karşılık gelen kimlik doğrulama düzenini ayarlar. OIDC işleyicisinin, istekler arasında kullanıcı kimlik bilgilerini kalıcı hale getiren bir oturum açma düzeni kullanması gerekir. Aşağıdaki satır yalnızca tanıtım amaçlıdır. Atlanırsa, DefaultSignInScheme geri dönüş değeri olarak kullanılır.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

ve openid () için kapsamlar profile (İsteğe bağlı): Scope OIDC işleyicisinin çalışması gerektiğinden ve openid kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmaya profile dahil edilirse bunların yeniden eklenmesiAuthentication:Schemes:MicrosoftOidc:Scope gerekebilir. Genel yapılandırma yönergeleri için bkz . ASP.NET Core'da yapılandırma ve ASP.NET Core Blazor yapılandırması.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

SaveTokens: Başarılı bir yetkilendirmeden sonra erişim ve yenileme belirteçlerinin içinde AuthenticationProperties depolanıp depolanmayacağını tanımlar. Yenileme belirtecinin etkileşimli olmayan belirteç yenilemesi için depolanması için bu özellik olarak ayarlanır true .

oidcOptions.SaveTokens = true;

Çevrimdışı erişim için kapsam (Scope): Yenileme belirteci için offline_access kapsam gereklidir.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Authority ve ClientId: OIDC çağrıları için Yetkili ve İstemci Kimliğini ayarlar.

oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";

Aşağıdaki örnekte kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeee ve İstemci Kimliği 00001111-aaaa-2222-bbbb-3333cccc4444kullanılır:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Çok kiracılı uygulamalar için "ortak" yetkili kullanılmalıdır. Tek kiracılı uygulamalar için "ortak" yetkiliyi de kullanabilirsiniz, ancak bu bölümün ilerleyen bölümlerinde gösterildiği gibi özel IssuerValidator bir yetki gereklidir.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: OIDC işleyicisini yalnızca yetkilendirme kodu akışı gerçekleştirecek şekilde yapılandırılır. Bu modda örtük izinler ve karma akışlar gereksizdir. OIDC işleyicisi, yetkilendirme uç noktasından döndürülen kodu kullanarak uygun belirteçleri otomatik olarak istemektedir.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims ve NameClaimType ve RoleClaimType yapılandırması: Birçok OIDC sunucusu SOAP/WS-Fed varsayılanları yerine "name" ve "role" kullanır. MapInboundClaims olarak ayarlandığındafalse, işleyici talep eşlemeleri gerçekleştirmez ve JWT'den talep adları doğrudan uygulama tarafından kullanılır. Aşağıdaki örnek, rol talep türünü roles için uygun olan "" olarak ayarlar. Daha fazla bilgi için kimlik sağlayıcınıza başvurun.

Note

MapInboundClaims çoğu OIDC sağlayıcısı için olarak ayarlanmalıdır false ve bu da taleplerin yeniden adlandırılmasını önler.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Yol yapılandırması: Yollar, uygulamayı OIDC sağlayıcısına kaydederken yapılandırılan yeniden yönlendirme URI'siyle (oturum açma geri çağırma yolu) ve oturumu kapatma sonrası yeniden yönlendirme (oturumu kapatılmış geri çağırma yolu) yollarıyla eşleşmelidir. Azure portalında yollar, uygulama kaydının Kimlik Doğrulaması dikey penceresinde yapılandırılır. Hem oturum açma hem de oturum kapatma yolları yeniden yönlendirme URI'leri olarak kaydedilmelidir. Varsayılan değerler /signin-oidc ve /signout-callback-oidc.

CallbackPath: Kullanıcı temsilcisinin döndürüldüğü, uygulamanın temel yolu içindeki istek yolu.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signin-oidc

Note

Microsoft Entra ID kullanılırken adresler için localhost bağlantı noktası gerekmiyor. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

SignedOutCallbackPath (yapılandırma anahtarı: "SignedOutCallbackPath"): Kullanıcı aracısının kimlik sağlayıcısından oturum kapattıktan sonra ilk kez döndüğü uygulamanın temel yolundaki istek yolu, OIDC işleyicisi tarafından yakalanır. "/signout-callback-oidc" varsayılan değeri kullanıldığından örnek uygulama yol için bir değer ayarlamaz. İsteği durdurduktan sonra, belirtilirse OIDC işleyicisi SignedOutRedirectUri veya RedirectUri öğelerine yönlendirilir.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signout-callback-oidc

Note

Microsoft Entra Id kullanırken, Web platformu yapılandırmasının Entra veya Azure portalındaki Yeniden Yönlendirme URI'si girişlerinde yolu ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir. Oturumu kapatan geri çağırma yolu URI'sini Uygulamanın Entra'daki kaydına eklemezseniz, Entra kullanıcıyı uygulamaya geri yönlendirmeyi reddeder ve yalnızca tarayıcı penceresini kapatmasını ister.

RemoteSignOutPath: Bu yolda alınan istekler, işleyicinin oturum kapatma düzenini kullanarak oturumu kapatmayı çağırmasına neden olur.

Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost/signout-oidc

Note

Microsoft Entra ID kullanırken, Entra veya Azure portalında Ön kanal oturum kapatma URL'sini ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");

Örnekler (varsayılan değerler):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Yalnızca "ortak" uç nokta ile Microsoft Azure): TokenValidationParameters.IssuerValidatorBirçok OIDC sağlayıcısı varsayılan sağlayıcı doğrulayıcı ile çalışırken, {TENANT ID} tarafından döndürülen Kiracı Kimliği (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) ile parametrelendirilen sağlayıcıyı da hesaba katmamız gerekmektedir. Daha fazla bilgi için OpenID Connect ile Azure AD "ortak" uç noktası ve SecurityTokenInvalidIssuerException (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731) başlığına bakın.

Yalnızca "ortak" uç noktaya sahip Microsoft Entra Id veya Azure AD B2C kullanan uygulamalar için:

var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;

Blazor Web App müşteri projesi (BlazorWebAppOidc.Client)

BlazorWebAppOidc.Client projesi, Blazor Web App'in istemci tarafı projesidir.

İstemci, sunucu tarafından geçirilen kimlik doğrulama durumunu seri durumdan çıkarmak ve kullanmak için AddAuthenticationStateDeserialization öğesini çağırır. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.

PersistentAuthenticationStateProvider() sınıfıPersistentAuthenticationStateProvider.cs, sunucuda işlendiğinde sayfada kalıcı olan verileri arayarak kullanıcının kimlik doğrulama durumunu belirleyen bir istemci tarafıdırAuthenticationStateProvider. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.

Kullanıcının oturum açması veya kapatması gerekiyorsa tam sayfa yeniden yükleme gerekir.

Örnek uygulama yalnızca görüntüleme amacıyla bir kullanıcı adı ve e-posta sağlar.

Microsoft Entra Id veya Azure AD B2C için, hem OIDC hem de kimlik doğrulama işleyicilerini uygun varsayılanlarla ekleyen Microsoft AddMicrosoftIdentityWebApp Web'denIdentity(, Microsoft.Identity.Web) kullanabilirsiniz. Bu makaledeki örnek uygulama ve yönergeler Microsoft Identity Web'i kullanmaz. Kılavuzda, OIDC işleyicisinin herhangi bir OIDC sağlayıcısı için el ile nasıl yapılandırılır gösterilmektedir. Microsoft Identity Web'i uygulama hakkında daha fazla bilgi için, Microsoft Entra ID ile bir ASP.NET Core'u Blazor Web App güvence altına almak başlıklı bölüme bakın.

Makalenin bu sürümü, genel Etkileşimli Sunucu işlemeyi (tek proje) benimseyen bir uygulamayla Ön Uç için Arka Uç (BFF) desenini benimsemeden OIDC'yi uygulamayı kapsar. BFF düzeni, dış hizmetlere kimliği doğrulanmış istekler yapmak için kullanışlıdır. Uygulamanın belirtimi genel Etkileşimli Otomatik işleme ile BFF desenini benimsemeyi çağırıyorsa makale sürümü seçicisini BFF deseni olarak değiştirin.

Aşağıdaki özellik benimsenmiştir:

  • Blazor Web App küresel etkileşimle sunucu işleme modunu kullanır.
  • Bu uygulama, herhangi bir OIDC kimlik doğrulama akışı için bir başlangıç noktasıdır. OIDC, uygulamada el ile yapılandırılır ve Microsoft Entra Kimliği'ne veya Microsoft Identity Web paketlerine dayanmaz ve örnek uygulama Için Microsoft Azure barındırma gerekmez. Ancak örnek uygulama Entra, Microsoft Identity Web ile kullanılabilir ve Azure'da barındırılabilir.
  • Otomatik etkileşimli olmayan belirteç yenileme.
  • Ayrı bir web API'si projesi, hava durumu verileri için güvenli bir web API çağrısı gösterir.

Tr-TR: .NET için Microsoft Kimlik Doğrulama Kitaplığı, Microsoft Identity Web ve Microsoft Entra ID kullanılarak alternatif bir deneyim için bkz. Microsoft Entra ID ile ASP.NET Core'un Blazor Web App güvenliğini sağlama.

Örnek çözüm

Örnek uygulama aşağıdaki projelerden oluşur:

  • BlazorWebAppOidcServer: Blazor Web App sunucu tarafı projesi (genel Etkileşimli Sunucu işleme).
  • MinimalApiJwt: Hava durumu verileri için Minimum API uç noktası içeren arka uç web API'si.

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 8 veya sonraki bir sürümün klasöründedir BlazorWebAppOidcServer .

Ö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 BlazorWebAppOidcServer 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ı (BlazorWebAppOidcServer) bir Web platform yapılandırması ve Yeniden Yönlendirme URI'sihttps://localhost/signin-oidc olacak şekilde (bir bağlantı noktası gerekmez) kaydettirin. Uygulamanın kiracı kimliği ve istemci kimliği ile birlikte web API'sinin temel adresi, Uygulama Kimliği URI'si ve hava durumu kapsamı adı, uygulamayı Program 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.

İstemci gizli anahtarını oluşturma

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

Warning

Uygulama gizli dizilerini, bağlantı dizelerini, 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.

Yerel geliştirme testi için, sunucu projesinin istemci gizli dizisini yapılandırma anahtarı Blazoraltında depolamak için Authentication:Schemes:MicrosoftOidc:ClientSecret kullanın.

Sunucu Blazor projesi Gizli Yönetici aracı için başlatılmadı. Aşağıdaki komutu yürütmek için Visual Studio'daki Developer PowerShell komut kabuğu gibi bir komut kabuğu kullanın. Komutunu yürütmeden önce, komutuyla dizinini cd sunucu projesinin dizinine değiştirin. "Komut, uygulamanın proje dosyasında (<UserSecretsId>) bir kullanıcı gizli bilgileri tanımlayıcısı oluşturur."

dotnet user-secrets init

İstemci gizli dizisini ayarlamak için aşağıdaki komutu yürütür. Yer {SECRET} tutucu, uygulamanın kaydından alınan istemci gizli dizisidir:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

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

MinimalApiJwt proje

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.

Proje, Geliştirme ortamında OpenAPI belgeleri ve Swagger kullanıcı arabirimi oluşturmak için paketler ve yapılandırma içerir. Daha fazla bilgi için bkz. Oluşturulan OpenAPI belgelerini kullanma.

Proje, hava durumu verileri için minimum API uç noktası oluşturur:

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();

Projenin JwtBearerOptions dosyasındaki AddJwtBearer çağrısının Program bölümünde projeyi yapılandırın.

Authority OIDC çağrıları yapmak için Yetkilendirme'yi ayarlar. Proje için MinimalApiJwt ayrı bir uygulama kaydı kullanmanızı öneririz. Yetkilendirme, kimlik sağlayıcısı tarafından döndürülen JWT'nin düzenleyicisiyle (iss) eşleşir.

jwtOptions.Authority = "{AUTHORITY}";

Yetki Biçimi, kullanılan kiracının türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeeekullanılır.

ME-ID kiracı yetkilisi örneği:

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

AAD B2C kiracı yetkilisi örneği:

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

Audience alınan OIDC belirtecinin Hedef Kitlesini ayarlar.

jwtOptions.Audience = "{APP ID URI}";

Note

Microsoft Entra Id kullanırken, değeri yalnızca Entra veya Azure portalında API'yi kullanıma sunma altında kapsam eklerken Weather.Get yapılandırılan Uygulama Kimliği URI'sinin yolu ile eşleştirin. Değere kapsam adını ("Weather.Get," eklemeyin.

Hedef kitlenin formatı, kullanılan kiracı türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği contoso ve İstemci Kimliği 11112222-bbbb-3333-cccc-4444dddd5555kullanılır.

ME-ID kiracı Uygulama Kimliği URI örneği:

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

AAD B2C kiracı uygulama kimliği URI örneği:

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

BlazorWebAppOidcServer proje

Otomatik etkileşimli olmayan belirteç yenilemesi özel cookie bir yenileyici (CookieOidcRefresher.cs ) tarafından yönetilir.

A DelegatingHandler (TokenHandler) kullanıcının erişim belirtecini giden isteklere eklemeyi yönetir. Belirteç işleyicisi yalnızca statik sunucu tarafı işleme (statik SSR) sırasında yürütülür, bu nedenle kullanımı HttpContext bu senaryoda güvenlidir. Daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamalarında IHttpContextAccessor/HttpContext ve ASP.NET Core sunucu tarafı ve Blazor Web App ek güvenlik senaryoları.

TokenHandler.cs:

public class TokenHandler(IHttpContextAccessor httpContextAccessor) : 
    DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (httpContextAccessor.HttpContext is null)
        {
            throw new Exception("HttpContext not available");
        }

        var accessToken = await httpContextAccessor.HttpContext
            .GetTokenAsync("access_token");

        request.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", accessToken);

        return await base.SendAsync(request, cancellationToken);
    }
}

Projenin Program dosyasında belirteç işleyicisi (TokenHandler), hizmet olarak kaydedilir ve AddHttpMessageHandler ("MinimalApiJwt") kullanarak arka uç web API'sine güvenli istekler göndermek için ile ExternalApi ileti işleyicisi olarak belirtilir.

builder.Services.AddScoped<TokenHandler>();

builder.Services.AddHttpClient("ExternalApi",
      client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ?? 
          throw new Exception("Missing base address!")))
      .AddHttpMessageHandler<TokenHandler>();

Bileşen, Weather yetkisiz erişimi önlemek için özniteliğini[Authorize] kullanır. Bir yetkilendirme ilkesi aracılığıyla uygulama genelinde yetkilendirme gerektirme ve genel uç noktaların bir alt kümesinde yetkilendirmeyi geri çevirme hakkında daha fazla bilgi için Sayfalar OIDC kılavuzunaRazor bakın.

ExternalApi HTTP istemcisi, güvenli web API'sine hava durumu verileri isteğinde bulunmak için kullanılır. OnInitializedAsync Yaşam döngüsü olayıWeather.razor:

using var request = new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
var client = ClientFactory.CreateClient("ExternalApi");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();

forecasts = await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
    throw new IOException("No weather forecast!");

Projenin appsettings.json dosyasında dış API URI'sini yapılandırın:

"ExternalApiUri": "{BASE ADDRESS}"

Example:

"ExternalApiUri": "https://localhost:7277"

OpenIdConnectOptions Aşağıdaki yapılandırma, çağrısında Programprojenin AddOpenIdConnect dosyasında bulunur:

PushedAuthorizationBehavior: Gönderilen Yetkilendirme İstekleri (PAR) desteğini denetler. Varsayılan olarak, kimlik sağlayıcısının bulma belgesinin (genellikle adresinde .well-known/openid-configurationbulunur) PAR desteği tanıtıyorsa, bu ayar PAR kullanmaktır. Uygulama için PAR desteğine ihtiyaç duyarsanız değerini atayabilirsiniz PushedAuthorizationBehavior.Require. PAR, Microsoft Entra tarafından desteklenmez ve Entra'nın gelecekte desteklemesi için bir plan yoktur.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Başarılı bir kimlik doğrulamasından sonra kullanıcının kimliğini kalıcı hale getirmekle sorumlu ara yazılıma karşılık gelen kimlik doğrulama düzenini ayarlar. OIDC işleyicisinin, istekler arasında kullanıcı kimlik bilgilerini kalıcı hale getiren bir oturum açma düzeni kullanması gerekir. Aşağıdaki satır yalnızca tanıtım amaçlıdır. Atlanırsa, DefaultSignInScheme geri dönüş değeri olarak kullanılır.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

ve openid () için kapsamlar profile (İsteğe bağlı): Scope OIDC işleyicisinin çalışması gerektiğinden ve openid kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmaya profile dahil edilirse bunların yeniden eklenmesiAuthentication:Schemes:MicrosoftOidc:Scope gerekebilir. Genel yapılandırma yönergeleri için bkz . ASP.NET Core'da yapılandırma ve ASP.NET Core Blazor yapılandırması.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

Weather.Get Hava durumu verileri için dış web API'sine erişim kapsamını yapılandırın. Aşağıdaki örnek, ME-ID kiracı etki alanında Entra Kimliği'nin kullanılmasına dayanmaktadır. Aşağıdaki örnekte yer tutucu, {APP ID URI} web API'sinin kullanıma sunulduğu Entra veya Azure portalında bulunur. Diğer tüm kimlik sağlayıcıları için uygun kapsamı kullanın.

oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");

Kapsamın biçimi, kullanılan kiracının türüne bağlıdır. Aşağıdaki örneklerde Kiracı Etki Alanı contoso.onmicrosoft.com ve İstemci Kimliği 11112222-bbbb-3333-cccc-4444dddd5555 olarak belirtilmiştir.

ME-ID kiracı Uygulama Kimliği URI örneği:

oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

AAD B2C kiracı uygulama kimliği URI örneği:

oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

SaveTokens: Başarılı bir yetkilendirmeden sonra erişim ve yenileme belirteçlerinin içinde AuthenticationProperties depolanıp depolanmayacağını tanımlar. Yenileme belirtecinin etkileşimli olmayan belirteç yenilemesi için depolanması için bu özellik olarak ayarlanır true .

oidcOptions.SaveTokens = true;

Çevrimdışı erişim için kapsam (Scope): Yenileme belirteci için offline_access kapsam gereklidir.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Authority ve ClientId: OIDC çağrıları için Yetkili ve İstemci Kimliğini ayarlar.

oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";

Aşağıdaki örnekte kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeee ve İstemci Kimliği 00001111-aaaa-2222-bbbb-3333cccc4444kullanılır:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Çok kiracılı uygulamalar için "ortak" yetkili kullanılmalıdır. Tek kiracılı uygulamalar için "ortak" yetkiliyi de kullanabilirsiniz, ancak bu bölümün ilerleyen bölümlerinde gösterildiği gibi özel IssuerValidator bir yetki gereklidir.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: OIDC işleyicisini yalnızca yetkilendirme kodu akışı gerçekleştirecek şekilde yapılandırılır. Bu modda örtük izinler ve karma akışlar gereksizdir. OIDC işleyicisi, yetkilendirme uç noktasından döndürülen kodu kullanarak uygun belirteçleri otomatik olarak istemektedir.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims ve NameClaimType ve RoleClaimType yapılandırması: Birçok OIDC sunucusu SOAP/WS-Fed varsayılanları yerine "name" ve "role" kullanır. MapInboundClaims olarak ayarlandığındafalse, işleyici talep eşlemeleri gerçekleştirmez ve JWT'den talep adları doğrudan uygulama tarafından kullanılır. Aşağıdaki örnek, rol talep türünü roles için uygun olan "" olarak ayarlar. Daha fazla bilgi için kimlik sağlayıcınıza başvurun.

Note

MapInboundClaims çoğu OIDC sağlayıcısı için olarak ayarlanmalıdır false ve bu da taleplerin yeniden adlandırılmasını önler.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Yol yapılandırması: Yollar, uygulamayı OIDC sağlayıcısına kaydederken yapılandırılan yeniden yönlendirme URI'siyle (oturum açma geri çağırma yolu) ve oturumu kapatma sonrası yeniden yönlendirme (oturumu kapatılmış geri çağırma yolu) yollarıyla eşleşmelidir. Azure portalında yollar, uygulama kaydının Kimlik Doğrulaması dikey penceresinde yapılandırılır. Hem oturum açma hem de oturum kapatma yolları yeniden yönlendirme URI'leri olarak kaydedilmelidir. Varsayılan değerler /signin-oidc ve /signout-callback-oidc.

CallbackPath: Kullanıcı temsilcisinin döndürüldüğü, uygulamanın temel yolu içindeki istek yolu.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signin-oidc

Note

Microsoft Entra ID kullanılırken adresler için localhost bağlantı noktası gerekmiyor. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

SignedOutCallbackPath (yapılandırma anahtarı: "SignedOutCallbackPath"): Kullanıcı aracısının kimlik sağlayıcısından oturum kapattıktan sonra ilk kez döndüğü uygulamanın temel yolundaki istek yolu, OIDC işleyicisi tarafından yakalanır. "/signout-callback-oidc" varsayılan değeri kullanıldığından örnek uygulama yol için bir değer ayarlamaz. İsteği durdurduktan sonra, belirtilirse OIDC işleyicisi SignedOutRedirectUri veya RedirectUri öğelerine yönlendirilir.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signout-callback-oidc

Note

Microsoft Entra Id kullanırken, Web platformu yapılandırmasının Entra veya Azure portalındaki Yeniden Yönlendirme URI'si girişlerinde yolu ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir. Oturumu kapatan geri çağırma yolu URI'sini Uygulamanın Entra'daki kaydına eklemezseniz, Entra kullanıcıyı uygulamaya geri yönlendirmeyi reddeder ve yalnızca tarayıcı penceresini kapatmasını ister.

RemoteSignOutPath: Bu yolda alınan istekler, işleyicinin oturum kapatma düzenini kullanarak oturumu kapatmayı çağırmasına neden olur.

Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost/signout-oidc

Note

Microsoft Entra ID kullanırken, Entra veya Azure portalında Ön kanal oturum kapatma URL'sini ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");

Örnekler (varsayılan değerler):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Yalnızca "ortak" uç nokta ile Microsoft Azure): TokenValidationParameters.IssuerValidatorBirçok OIDC sağlayıcısı varsayılan sağlayıcı doğrulayıcı ile çalışırken, {TENANT ID} tarafından döndürülen Kiracı Kimliği (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) ile parametrelendirilen sağlayıcıyı da hesaba katmamız gerekmektedir. Daha fazla bilgi için OpenID Connect ile Azure AD "ortak" uç noktası ve SecurityTokenInvalidIssuerException (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731) başlığına bakın.

Yalnızca "ortak" uç noktaya sahip Microsoft Entra Id veya Azure AD B2C kullanan uygulamalar için:

var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;

Microsoft Entra Id veya Azure AD B2C için, hem OIDC hem de kimlik doğrulama işleyicilerini uygun varsayılanlarla ekleyen Microsoft AddMicrosoftIdentityWebApp Web'denIdentity(, Microsoft.Identity.Web) kullanabilirsiniz. Bu makaledeki örnek uygulama ve yönergeler Microsoft Identity Web'i kullanmaz. Kılavuzda, OIDC işleyicisinin herhangi bir OIDC sağlayıcısı için el ile nasıl yapılandırılır gösterilmektedir. Microsoft Identity Web'i uygulama hakkında daha fazla bilgi için, Microsoft Entra ID ile bir ASP.NET Core'u Blazor Web App güvence altına almak başlıklı bölüme bakın.

Makalenin bu sürümü, Ön Uç için Arka Uç (BFF) deseniyle OIDC'yi uygulamayı kapsar. Uygulamanın belirtimi BFF desenini benimsemeyi çağırmıyorsa, makale sürümü seçicisini BFF Dışı desen (Etkileşimli Otomatik) (Etkileşimli Otomatik işleme) veya BFF Dışı desen (Etkileşimli Sunucu) (Etkileşimli Sunucu işleme) olarak değiştirin.

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 uygulama 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 minimum API uç noktası örneği içeren arka uç web API'si.
  • BlazorWebAppOidc: Blazor Web App sunucu tarafı projesi. Proje, arka uç web API projesinde YARP'yi kullanarak bir hava durumu tahmin uç noktasına istekleri proxy yapar ve kimlik doğrulamasında MinimalApiJwt depolanır.
  • BlazorWebAppOidc.Client: Blazor Web App için 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 8 veya sonraki bir sürümün klasöründedir BlazorWebAppOidcBff .

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

Blazor Web App küresel etkileşim ile Otomatik işleme modunu kullanır.

Sunucu projesi, AddAuthenticationStateSerialization kullanarak istemciye kimlik doğrulama durumunu aktaran bir sunucu tarafı kimlik doğrulama durumu sağlayıcısı eklemek için çağırır PersistentComponentState. İstemci, sunucu tarafından geçirilen kimlik doğrulama durumunu seri durumdan çıkarmak ve kullanmak için AddAuthenticationStateDeserialization öğesini çağırır. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.

PersistingAuthenticationStateProvider sınıfı (PersistingAuthenticationStateProvider.cs), kimlik doğrulama durumunu istemciye aktarmak için AuthenticationStateProvider kullanan sunucu tarafı bir PersistentComponentState olup, daha sonra WebAssembly uygulamasının ömrü boyunca sabit kalır.

Bu uygulama, herhangi bir OIDC kimlik doğrulama akışı için bir başlangıç noktasıdır. OIDC, uygulamada el ile yapılandırılır ve Microsoft Entra Kimliği'ne veya Microsoft Identity Web paketlerine dayanmaz ve örnek uygulama Için Microsoft Azure barındırma gerekmez. Ancak örnek uygulama Entra, Microsoft Identity Web ile kullanılabilir ve Azure'da barındırılabilir.

Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.

Ön Uç için Arka Uç (BFF) deseni, hizmet bulma için Aspire ve arka uç uygulamasındaki hava durumu tahmini uç noktasına yönlendirilen istekler için YARP kullanılarak benimsenmiştir.

Arka uç web API'si (MinimalApiJwt), oturum açmada Blazor Web Apptarafından cookie kaydedilen JWT belirteçlerini doğrulamak için JWT taşıyıcı kimlik doğrulamasını 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 (Yet Another Reverse Proxy), ters proxy sunucusu oluşturmak için kullanılan bir kitaplıktır. MapForwarder Program sunucu projesinin dosyasında, giden istek, özelleştirilmiş dönüşümler ve varsayılan HTTP istemcisi için varsayılan yapılandırmayı kullanarak belirtilen desenle eşleşen HTTP isteklerinin belirli bir hedefe doğrudan iletilmesi eklenir:

  • Bileşen Weather sunucuda işlenirken, bileşen ServerWeatherForecaster sınıfını kullanarak, kullanıcının erişim belirteciyle hava durumu verileri isteğini aracılık eder. IHttpContextAccessor.HttpContext, HttpContext yöntemi tarafından kullanıma uygun bir GetWeatherForecastAsync olup olmadığını belirler. Daha fazla bilgi için bkz. ASP.NET Core Razor bileşenleri.
  • Bileşen istemcide işlendiğinde, bileşen, sunucu projesine bir web API çağrısı yapmak için istemci projesinin ClientWeatherForecaster dosyasında önceden yapılandırılmış HttpClient kullanan Program hizmet uygulamasını kullanır. Sunucu projesinin /weather-forecast dosyasında tanımlanan minimum API uç noktası (Program), hava durumu verilerini almak için isteği kullanıcının erişim belirteciyle dönüştürür.

'de Blazor Web Apphizmet soyutlamaları kullanan (web) API çağrıları hakkında daha fazla bilgi için bkz. ASP.NET Core Blazor uygulamasından web API'sini çağırma.

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 BlazorWebAppOidc 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ı (BlazorWebAppOidc/BlazorWebApOidc.Client) Web platformu yapılandırmasına ve Yeniden Yönlendirme URI'sinehttps://localhost/signin-oidc (bağlantı noktası gerekmez) kaydedin. Uygulamanın kiracı kimliği ve istemci kimliği ile birlikte web API'sinin temel adresi, Uygulama Kimliği URI'si ve hava durumu kapsamı adı, uygulamayı Program 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.

İstemci gizli anahtarını oluşturma

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

Warning

Uygulama gizli dizilerini, bağlantı dizelerini, 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.

Yerel geliştirme testi için, sunucu projesinin istemci gizli dizisini yapılandırma anahtarı Blazoraltında depolamak için Authentication:Schemes:MicrosoftOidc:ClientSecret kullanın.

Sunucu Blazor projesi Gizli Yönetici aracı için başlatılmadı. Aşağıdaki komutu yürütmek için Visual Studio'daki Developer PowerShell komut kabuğu gibi bir komut kabuğu kullanın. Komutunu yürütmeden önce, komutuyla dizinini cd sunucu projesinin dizinine değiştirin. komutu bir kullanıcı gizli dizi tanımlayıcısı oluşturur (<UserSecretsId> sunucu uygulamasının proje dosyasında):

dotnet user-secrets init

İstemci gizli dizisini ayarlamak için aşağıdaki komutu yürütür. Yer {SECRET} tutucu, uygulamanın kaydından alınan istemci gizli dizisidir:

dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"

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

Aspire proje

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

önkoşullarını Aspirekarşıladığınızdan emin olun. 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. Güvenli olmayan ve güvenli başlatma ayarları profilleri örneği de dahil olmak üzere daha fazla bilgi için bkz. Güvenli olmayan aktarıma izin verme (AspireAspirebelgeler)..

MinimalApiJwt proje

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ı projesinden Blazor Web App (BlazorWebAppOidc) gelen istekler projeye yakın MinimalApiJwt olur.

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.

Proje, Geliştirme ortamında OpenAPI belgeleri ve Swagger kullanıcı arabirimi oluşturmak için paketler ve yapılandırma içerir. Daha fazla bilgi için bkz. Oluşturulan OpenAPI belgelerini kullanma.

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ği denetleyiciye veya eyleme [Authorize] ekleyin.

Projenin JwtBearerOptions dosyasındaki AddJwtBearer çağrısının Program bölümünde projeyi yapılandırın.

Authority OIDC çağrıları yapmak için Yetkilendirme'yi ayarlar. Proje için MinimalApiJwt ayrı bir uygulama kaydı kullanmanızı öneririz. Yetkilendirme, kimlik sağlayıcısı tarafından döndürülen JWT'nin düzenleyicisiyle (iss) eşleşir.

jwtOptions.Authority = "{AUTHORITY}";

Yetki Biçimi, kullanılan kiracının türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeeekullanılır.

ME-ID kiracı yetkilisi örneği:

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

AAD B2C kiracı yetkilisi örneği:

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

Audience alınan OIDC belirtecinin Hedef Kitlesini ayarlar.

jwtOptions.Audience = "{APP ID URI}";

Note

Microsoft Entra Id kullanırken, değeri yalnızca Entra veya Azure portalında API'yi kullanıma sunma altında kapsam eklerken Weather.Get yapılandırılan Uygulama Kimliği URI'sinin yolu ile eşleştirin. Değere kapsam adını ("Weather.Get," eklemeyin.

Hedef kitlenin formatı, kullanılan kiracı türüne bağlıdır. Microsoft Entra Id için aşağıdaki örneklerde kiracı kimliği contoso ve İstemci Kimliği 11112222-bbbb-3333-cccc-4444dddd5555kullanılır.

ME-ID kiracı Uygulama Kimliği URI örneği:

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

AAD B2C kiracı uygulama kimliği URI örneği:

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

Sunucu tarafı Blazor Web App projesi (BlazorWebAppOidc)

Bu bölümde sunucu tarafı Blazor projesinin nasıl yapılandırılır açıklanmaktadır.

Aşağıdaki OpenIdConnectOptions yapılandırması, Program çağrısı yapıldığında projenin AddOpenIdConnect dosyasında bulunur.

PushedAuthorizationBehavior: Gönderilen Yetkilendirme İstekleri (PAR) desteğini denetler. Varsayılan olarak, kimlik sağlayıcısının bulma belgesinin (genellikle adresinde .well-known/openid-configurationbulunur) PAR desteği tanıtıyorsa, bu ayar PAR kullanmaktır. Uygulama için PAR desteğine ihtiyaç duyarsanız değerini atayabilirsiniz PushedAuthorizationBehavior.Require. PAR, Microsoft Entra tarafından desteklenmez ve Entra'nın gelecekte desteklemesi için bir plan yoktur.

oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;

SignInScheme: Başarılı bir kimlik doğrulamasından sonra kullanıcının kimliğini kalıcı hale getirmekle sorumlu ara yazılıma karşılık gelen kimlik doğrulama düzenini ayarlar. OIDC işleyicisinin, istekler arasında kullanıcı kimlik bilgilerini kalıcı hale getiren bir oturum açma düzeni kullanması gerekir. Aşağıdaki satır yalnızca tanıtım amaçlıdır. Atlanırsa, DefaultSignInScheme geri dönüş değeri olarak kullanılır.

oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

ve openid () için kapsamlar profile (İsteğe bağlı): Scope OIDC işleyicisinin çalışması gerektiğinden ve openid kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmaya profile dahil edilirse bunların yeniden eklenmesiAuthentication:Schemes:MicrosoftOidc:Scope gerekebilir. Genel yapılandırma yönergeleri için bkz . ASP.NET Core'da yapılandırma ve ASP.NET Core Blazor yapılandırması.

oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);

SaveTokens: Başarılı bir yetkilendirmeden sonra erişim ve yenileme belirteçlerinin içinde AuthenticationProperties depolanıp depolanmayacağını tanımlar. Değer, hava durumu verilerine yönelik isteklerin kimliğini doğrulamak için arka uç web API projesinde true olarak ayarlanırMinimalApiJwt.

oidcOptions.SaveTokens = true;

Çevrimdışı erişim için kapsam (Scope): Yenileme belirteci için offline_access kapsam gereklidir.

oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

Web API'sinden hava durumu verilerini alma kapsamları (Scope): Hava durumu verileri için dış web API'sine erişim kapsamını yapılandırın Weather.Get . Aşağıdaki örnekte yer tutucu, {APP ID URI} web API'sinin kullanıma sunulduğu Entra veya Azure portalında bulunur. Diğer tüm kimlik sağlayıcıları için uygun kapsamı kullanın.

oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");

Kapsamın biçimi, kullanılan kiracının türüne bağlıdır. Aşağıdaki örneklerde Kiracı Etki Alanı contoso.onmicrosoft.com ve İstemci Kimliği 11112222-bbbb-3333-cccc-4444dddd5555 olarak belirtilmiştir.

ME-ID kiracı Uygulama Kimliği URI örneği:

oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

AAD B2C kiracı uygulama kimliği URI örneği:

oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");

Authority ve ClientId: OIDC çağrıları için Yetkili ve İstemci Kimliğini ayarlar.

oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";

Aşağıdaki örnekte kiracı kimliği aaaabbbb-0000-cccc-1111-dddd2222eeee ve İstemci Kimliği 00001111-aaaa-2222-bbbb-3333cccc4444kullanılır:

oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";

Çok kiracılı uygulamalar için "ortak" yetkili kullanılmalıdır. Tek kiracılı uygulamalar için "ortak" yetkiliyi de kullanabilirsiniz, ancak bu bölümün ilerleyen bölümlerinde gösterildiği gibi özel IssuerValidator bir yetki gereklidir.

oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";

ResponseType: OIDC işleyicisini yalnızca yetkilendirme kodu akışı gerçekleştirecek şekilde yapılandırılır. Bu modda örtük izinler ve karma akışlar gereksizdir. OIDC işleyicisi, yetkilendirme uç noktasından döndürülen kodu kullanarak uygun belirteçleri otomatik olarak istemektedir.

oidcOptions.ResponseType = OpenIdConnectResponseType.Code;

MapInboundClaims ve NameClaimType ve RoleClaimType yapılandırması: Birçok OIDC sunucusu SOAP/WS-Fed varsayılanları yerine "name" ve "role" kullanır. MapInboundClaims olarak ayarlandığındafalse, işleyici talep eşlemeleri gerçekleştirmez ve JWT'den gelen talep adları doğrudan uygulama tarafından kullanılır. Aşağıdaki örnek, rol talep türünü roles için uygun olan "" olarak ayarlar. Daha fazla bilgi için kimlik sağlayıcınıza başvurun.

Note

MapInboundClaims çoğu OIDC sağlayıcısı için olarak ayarlanmalıdır false ve bu da taleplerin yeniden adlandırılmasını önler.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

Yol yapılandırması: Yollar, uygulamayı OIDC sağlayıcısına kaydederken yapılandırılan yeniden yönlendirme URI'siyle (oturum açma geri çağırma yolu) ve oturumu kapatma sonrası yeniden yönlendirme (oturumu kapatılmış geri çağırma yolu) yollarıyla eşleşmelidir. Azure portalında yollar, uygulama kaydının Kimlik Doğrulaması dikey penceresinde yapılandırılır. Hem oturum açma hem de oturum kapatma yolları yeniden yönlendirme URI'leri olarak kaydedilmelidir. Varsayılan değerler /signin-oidc ve /signout-callback-oidc.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signin-oidc

Note

Microsoft Entra ID kullanılırken adresler için localhost bağlantı noktası gerekmiyor. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

SignedOutCallbackPath (yapılandırma anahtarı: "SignedOutCallbackPath"): Kullanıcı aracısının kimlik sağlayıcısından oturum kapattıktan sonra ilk kez döndüğü uygulamanın temel yolundaki istek yolu, OIDC işleyicisi tarafından yakalanır. "/signout-callback-oidc" varsayılan değeri kullanıldığından örnek uygulama yol için bir değer ayarlamaz. İsteği durdurduktan sonra, belirtilirse OIDC işleyicisi SignedOutRedirectUri veya RedirectUri öğelerine yönlendirilir.

Uygulamanın OIDC sağlayıcı kaydında oturum kapatma geri çağırma yolunu yapılandırın. Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost:{PORT}/signout-callback-oidc

Note

Microsoft Entra Id kullanırken, Web platformu yapılandırmasının Entra veya Azure portalındaki Yeniden Yönlendirme URI'si girişlerinde yolu ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir. Oturumu kapatan geri çağırma yolu URI'sini Uygulamanın Entra'daki kaydına eklemezseniz, Entra kullanıcıyı uygulamaya geri yönlendirmeyi reddeder ve yalnızca tarayıcı penceresini kapatmasını ister.

RemoteSignOutPath: Bu yolda alınan istekler, işleyicinin oturum kapatma düzenini kullanarak oturumu kapatmayı çağırmasına neden olur.

Aşağıdaki örnekte, {PORT} yer tutucusu uygulamanın bağlantı noktasıdır:

https://localhost/signout-oidc

Note

Microsoft Entra ID kullanırken, Entra veya Azure portalında Ön kanal oturum kapatma URL'sini ayarlayın. Entra kullanılırken localhost adresleri için bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktasını gerektirir.

oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");

Örnekler (varsayılan değerler):

oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");

(Yalnızca "ortak" uç nokta ile Microsoft Azure): TokenValidationParameters.IssuerValidatorBirçok OIDC sağlayıcısı varsayılan sağlayıcı doğrulayıcı ile çalışırken, {TENANT ID} tarafından döndürülen Kiracı Kimliği (https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration) ile parametrelendirilen sağlayıcıyı da hesaba katmamız gerekmektedir. Daha fazla bilgi için OpenID Connect ile Azure AD "ortak" uç noktası ve SecurityTokenInvalidIssuerException (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731) başlığına bakın.

Yalnızca "ortak" uç noktaya sahip Microsoft Entra Id veya Azure AD B2C kullanan uygulamalar için:

var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;

İstemci tarafı Blazor Web App projesi (BlazorWebAppOidc.Client)

BlazorWebAppOidc.Client projesi, Blazor Web App'in istemci tarafı projesidir.

İstemci, sunucu tarafından geçirilen kimlik doğrulama durumunu seri durumdan çıkarmak ve kullanmak için AddAuthenticationStateDeserialization öğesini çağırır. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.

PersistentAuthenticationStateProvider() sınıfıPersistentAuthenticationStateProvider.cs, sunucuda işlendiğinde sayfada kalıcı olan verileri arayarak kullanıcının kimlik doğrulama durumunu belirleyen bir istemci tarafıdırAuthenticationStateProvider. Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.

Kullanıcının oturum açması veya kapatması gerekiyorsa tam sayfa yeniden yükleme gerekir.

Örnek uygulama yalnızca görüntüleme amacıyla bir kullanıcı adı ve e-posta sağlar.

Yalnızca ad ve rol taleplerini seri hale getirme

Bu bölüm yalnızca BFF olmayan desen (Etkileşimli Otomatik) ve BFF deseni (Etkileşimli Otomatik) ve bunların örnek uygulamaları için geçerlidir.

Program dosyasında, tüm iddialar SerializeAllClaimstrue olarak ayarlanıp serileştirilir. Yalnızca CSR için ad ve rol taleplerinin seri hale getirilmesini 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 Program OIDC 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.

veya appsettings.json projesinin uygulama ayarları dosyasına (BlazorWebAppOidc) BlazorWebAppOidcServer aşağıdaki JSON yapılandırmasını ekleyin:

"Authentication": {
  "Schemes": {
    "MicrosoftOidc": {
      "Authority": "https://login.microsoftonline.com/{TENANT ID (BLAZOR APP)}/v2.0",
      "ClientId": "{CLIENT ID (BLAZOR APP)}",
      "CallbackPath": "/signin-oidc",
      "SignedOutCallbackPath": "/signout-callback-oidc",
      "RemoteSignOutPath": "/signout-oidc",
      "SignedOutRedirectUri": "/",
      "Scope": [
        "openid",
        "profile",
        "offline_access",
        "{APP ID URI (WEB API)}/Weather.Get"
      ]
    }
  }
},

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

  • {TENANT ID (BLAZOR APP)}: Blazor uygulamasının Kiracı Kimliği.
  • {CLIENT ID (BLAZOR APP)}: Uygulamanın İstemci Kimliği Blazor .
  • {APP ID URI (WEB API)}: Web API'sinin Uygulama Kimliği URI'si.

"Ortak" Yetkili (https://login.microsoftonline.com/common/v2.0) çok kiracılı uygulamalar için kullanılmalıdır. Tek kiracılı uygulamalarda "ortak" Yetkiliyi kullanmak için Tek kiracılı uygulamalar için "ortak" Yetkiliyi kullanma bölümüne bakın.

Ö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.

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

- oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
- oidcOptions.Scope.Add("...");
- oidcOptions.CallbackPath = new PathString("...");
- oidcOptions.SignedOutCallbackPath = new PathString("...");
- oidcOptions.RemoteSignOutPath = new PathString("...");
- oidcOptions.Authority = "...";
- oidcOptions.ClientId = "...";

ConfigureCookieOidc'un CookieOidcServiceCollectionExtensions.cs yönteminde, aşağıdaki satırı kaldırın.

- oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);

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:

Tek kiracılı uygulamalar için "ortak" Yetkiliyi kullanma

Tek kiracılı uygulamalar için "ortak" Yetki'yi kullanabilirsiniz, ancak özelleştirilmiş kuruluş doğrulayıcıyı uygulamak için aşağıdaki adımları izlemeniz gerekir.

Microsoft.IdentityModel.Validators NuGet paketini , BlazorWebAppOidcveya BlazorWebAppOidcServer projesine BlazorWebAppOidcBffekleyin.

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.

Dosyanın üst kısmında Program ad alanını Microsoft.IdentityModel.Validators kullanılabilir hale getirin:

using Microsoft.IdentityModel.Validators;

OIDC seçeneklerinin Program yapılandırıldığı dosyada aşağıdaki kodu kullanın:

var microsoftIssuerValidator = 
    AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = 
    microsoftIssuerValidator.Validate;

Daha fazla bilgi için OpenID Connect ile Azure AD "ortak" uç noktası ve SecurityTokenInvalidIssuerException (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731) başlığına bakın.

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>

Belirteç yenileme

Özel cookie yenileyici (CookieOidcRefresher.cs) uygulaması, süresi dolduğunda kullanıcının taleplerini otomatik olarak güncelleştirir. Mevcut uygulama, yenileme belirteci karşılığında jeton uç noktasından bir kimlik belirteci almayı bekler. Bu kimlik belirtecindeki talepler daha sonra kullanıcının taleplerini değiştirmek için kullanılır.

Örnek uygulama, belirteç yenilemesinde UserInfo uç noktasından talep istemek için kod içermez. Daha fazla bilgi için bkz BlazorWebAppOidc AddOpenIdConnect with GetClaimsFromUserInfoEndpoint = true doesn't propogate [sic] role claims to client . (dotnet/aspnetcore #58826).

Note

Bazı kimlik sağlayıcıları yalnızca yenileme belirteci kullanıldığında bir erişim belirteci döndürür. CookieOidcRefresher, kimlik doğrulama cookie'de depolanan önceki talep kümesini kullanmaya devam etmesi için ek mantıkla güncellenebilir veya UserInfo uç noktasından talep istemek amacıyla erişim belirteci kullanılabilir.

Şifreleme noncesi

Nonce, yeniden yürütme saldırılarını azaltmak için istemcinin oturumını kimlik belirteci ile ilişkilendiren bir dize değeridir.

Kimlik doğrulama süreçlerinin geliştirilmesi ve test edilmesi sırasında bir nonce hatası alırsanız, eski cookie veriler bir nonce hatasına yol açabileceğinden uygulama veya test kullanıcısında yapılan değişiklik ne kadar küçük olursa olsun, her test çalıştırması için yeni bir InPrivate/gizli tarayıcı oturumu kullanın. Daha fazla bilgi için Tanımlama bilgileri ve site verileri bölümüne bakın.

Yenileme belirteci yeni bir erişim belirteci ile değiştirildiğinde bir nonce ne gerekli ne de kullanılır. Örnek uygulamada, CookieOidcRefresher (CookieOidcRefresher.cs) kasıtlı olarak OpenIdConnectProtocolValidator.RequireNonce ayarlar false.

Microsoft Entra'ya kayıtlı olmayan uygulamalar için uygulama rolleri (ME-ID)

Bu bölüm, kimlik sağlayıcısı olarak Microsoft Entra Id (ME-ID) kullanmayan uygulamalarla ilgili. ME-ID ile kaydedilen uygulamalar için Microsoft Entra (ME-ID) ile kaydedilen uygulamalar için uygulama rolleri bölümüne bakın.

içinde rol talep türünü (TokenValidationParameters.RoleClaimType) OpenIdConnectOptionsProgram.csyapılandırın:

oidcOptions.TokenValidationParameters.RoleClaimType = "{ROLE CLAIM TYPE}";

Birçok OIDC kimlik sağlayıcısı için rol talep türü şeklindedir role. Doğru değer için kimlik sağlayıcınızın belgelerine bakın.

projedeki UserInfo sınıfını BlazorWebAppOidc.Client aşağıdaki sınıfla değiştirin.

UserInfo.cs:

using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;

namespace BlazorWebAppOidc.Client;

// Add properties to this class and update the server and client 
// AuthenticationStateProviders to expose more information about 
// the authenticated user to the client.
public sealed class UserInfo
{
    public required string UserId { get; init; }
    public required string Name { get; init; }
    public required string[] Roles { get; init; }

    public const string UserIdClaimType = "sub";
    public const string NameClaimType = "name";
    private const string RoleClaimType = "role";

    public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
        new()
        {
            UserId = GetRequiredClaim(principal, UserIdClaimType),
            Name = GetRequiredClaim(principal, NameClaimType),
            Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
                .ToArray(),
        };

    public ClaimsPrincipal ToClaimsPrincipal() =>
        new(new ClaimsIdentity(
            Roles.Select(role => new Claim(RoleClaimType, role))
                .Concat([
                    new Claim(UserIdClaimType, UserId),
                    new Claim(NameClaimType, Name),
                ]),
            authenticationType: nameof(UserInfo),
            nameType: NameClaimType,
            roleType: RoleClaimType));

    private static string GetRequiredClaim(ClaimsPrincipal principal,
        string claimType) =>
            principal.FindFirst(claimType)?.Value ??
            throw new InvalidOperationException(
                $"Could not find required '{claimType}' claim.");
}

Bu noktada, Razor bileşenler rol tabanlı ve ilke tabanlı yetkilendirmeyi benimseyebilir. Uygulama rolleri, her rol için bir talep olan taleplerde role görünür.

Microsoft Entra'ya kayıtlı uygulamalar için uygulama rolleri (ME-ID)

Microsoft Entra ID (ME-ID) kullanan uygulamalar için uygulama rollerini, ME-ID güvenlik gruplarını ve ME-ID yerleşik yönetici rollerini uygulamak için bu bölümdeki kılavuzu kullanın.

Bu bölümde açıklanan yaklaşım, kimlik doğrulaması cookie üst bilgisinde grupları ve rolleri göndermek için ME-ID'yi yapılandırır. Kullanıcılar yalnızca birkaç güvenlik grubunun ve rolünün üyesi olduğunda, üst bilgilerin çok uzun olduğu bir sorunla karşılaşılmadan, örneğin varsayılan üst bilgi uzunluğu sınırı 16 KB (MaxRequestBytes) olan IIS barındırma ile ilgili bir sorunla karşılaşılmadan çoğu barındırma platformunda aşağıdaki yaklaşım işe yaramalıdır. Üst bilgi uzunluğu yüksek grup veya rol üyeliğinden kaynaklanan bir sorunsa, kimlik doğrulaması boyutunu şişirmeyen bir yaklaşım olan ME-ID'den bir kullanıcının gruplarını ve rollerini ayrı olarak almak için Microsoft Graph'icookieiçin bu bölümdeki yönergeleri izlememenizi öneririz. Daha fazla bilgi için bkz. Hatalı İstek - İstek Çok Uzun - IIS Sunucusu (dotnet/aspnetcore #57545).

TokenValidationParameters.RoleClaimType içinde OpenIdConnectOptions rol talep türünü (Program.cs) yapılandırın. değerini olarak rolesayarlayın:

oidcOptions.TokenValidationParameters.RoleClaimType = "roles";

ME-ID Premium hesabı olmayan gruplara rol atayamazsınız , ancak kullanıcılara roller atayabilir ve standart bir Azure hesabı olan kullanıcılar için rol talepleri alabilirsiniz. Bu bölümdeki yönergeler için ME-ID Premium hesabı gerekmez.

Varsayılan dizinle çalışırken, uygulamanıza uygulama rolleri eklemek ve bunları jetonda almak için Uygulamanıza uygulama rolleri ekleyin ve bunları jetonda alın (ME-ID belgeler) başlığındaki yönergeleri izleyin ve rolleri yapılandırın ve atayın. Varsayılan dizinle çalışmıyorsanız, uygulamanın rollerini bildirim dosyasının girişinde el ile oluşturmak için Azure portalında appRoles uygulamanın bildirimini düzenleyin. Daha fazla bilgi için Rol talebini yapılandırma (ME-ID belgeleri) bölümüne bakın.

Kullanıcının Azure güvenlik grupları taleplere groups ulaşır ve kullanıcının yerleşik ME-ID yönetici rol atamaları iyi bilinen kimlik (wids) taleplerine ulaşır. Her iki talep türü için de değerler GUID'lerdir. Uygulama tarafından alındığında, bu talepler bileşenlerde Razor rol ve ilke yetkilendirmesi oluşturmak için kullanılabilir.

Uygulamanın Azure portalındaki bildiriminde özniteliğinigroupMembershipClaims olarak Allayarlayın. All değerinin ME-ID gönderimi, oturum açmış kullanıcının tüm güvenlik/dağıtım gruplarını (groups talepler) ve rolleri (wids talepler) içermesine yol açar. groupMembershipClaims özniteliğini ayarlamak için:

  1. Uygulamanın kaydını Azure portalında açın.
  2. Kenar çubuğunda Yönet>Bildirimi seçin.
  3. groupMembershipClaims özniteliğini bulun.
  4. değeri All olarak ayarlayın("groupMembershipClaims": "All" .
  5. Kaydet düğmesini seçin.

projedeki UserInfo sınıfını BlazorWebAppOidc.Client aşağıdaki sınıfla değiştirin.

UserInfo.cs:

using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;

namespace BlazorWebAppOidc.Client;

// Add properties to this class and update the server and client 
// AuthenticationStateProviders to expose more information about 
// the authenticated user to the client.
public sealed class UserInfo
{
    public required string UserId { get; init; }
    public required string Name { get; init; }
    public required string[] Roles { get; init; }
    public required string[] Groups { get; init; }
    public required string[] Wids { get; init; }

    public const string UserIdClaimType = "sub";
    public const string NameClaimType = "name";
    private const string RoleClaimType = "roles";
    private const string GroupsClaimType = "groups";
    private const string WidsClaimType = "wids";

    public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
        new()
        {
            UserId = GetRequiredClaim(principal, UserIdClaimType),
            Name = GetRequiredClaim(principal, NameClaimType),
            Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
                .ToArray(),
            Groups = principal.FindAll(GroupsClaimType).Select(c => c.Value)
                .ToArray(),
            Wids = principal.FindAll(WidsClaimType).Select(c => c.Value)
                .ToArray(),
        };

    public ClaimsPrincipal ToClaimsPrincipal() =>
        new(new ClaimsIdentity(
            Roles.Select(role => new Claim(RoleClaimType, role))
                .Concat(Groups.Select(role => new Claim(GroupsClaimType, role)))
                .Concat(Wids.Select(role => new Claim(WidsClaimType, role)))
                .Concat([
                    new Claim(UserIdClaimType, UserId),
                    new Claim(NameClaimType, Name),
                ]),
            authenticationType: nameof(UserInfo),
            nameType: NameClaimType,
            roleType: RoleClaimType));

    private static string GetRequiredClaim(ClaimsPrincipal principal,
        string claimType) =>
            principal.FindFirst(claimType)?.Value ??
            throw new InvalidOperationException(
                $"Could not find required '{claimType}' claim.");
}

Bu noktada Razor , bileşenler rol tabanlı ve ilke tabanlı yetkilendirmeyi benimseyebilir:

  • Uygulama rolleri, her rol için bir talep olan taleplerde roles görünür.
  • Güvenlik grupları, her bir grup için bir talep olacak şekilde groups taleplerinde görünür. Güvenlik grubu GUID'leri, bir güvenlik grubu oluşturduğunuzda Azure portalında görünür ve Identity>Grupları>Görünümü seçildiğinde > listelenir.
  • Yerleşik ME-ID yönetici rolleri, her rol için bir talep olan taleplerde wids görünür. wids Değeri b79fbf4d-3ef9-4689-8143-76b194e85509 olan talep, her zaman kiracının konuk olmayan hesapları için ME-ID tarafından gönderilir ve bir yönetici rolünü ifade etmez. Yönetici rolü GUID'leri (rol şablonu kimlikleri), Azure portalında Roller ve yöneticiler seçildiğinde ve ardından listelenen rol için üç noktaya (...) tıklayıp >açıklama kısmı görüldüğünde görünür. Rol şablonu kimlikleri , Microsoft Entra yerleşik rolleri (Entra belgeleri) içinde de listelenir.

Alternatif: Duende Erişim Belirteci Yönetimi

Örnek uygulamada, otomatik etkileşimli olmayan belirteç yenilemesi gerçekleştirmek için özel cookie bir yenileyici (CookieOidcRefresher.cs) uygulaması kullanılır. Alternatif bir çözüm açık kaynak Duende.AccessTokenManagement.OpenIdConnect paketinde bulunabilir.

Duende Erişim Belirteci Yönetimi, .NET çalışanı ve ASP.NET Core web uygulamaları için özel Blazor bir yenileyici eklemeye gerek kalmadan dahil olmak üzere cookieotomatik erişim belirteci yönetimi özellikleri sağlar.

Paket yüklendikten sonra, dosyada CookieOidcRefresher şu anda oturum açmış olan kullanıcı Program için ve erişim belirteci yönetimini kaldırın:

// Add services for token management
builder.Services.AddOpenIdConnectAccessTokenManagement();

// Register a typed HTTP client with token management support
builder.Services.AddHttpClient<InvoiceClient>(client =>
    {
        client.BaseAddress = new Uri("https://api.example.com/invoices/");
    })
    .AddUserAccessTokenHandler();

Yazılan HTTP istemcisi (veya uygulandıysa http istemcisi olarak adlandırılır), saydam yenileme belirteci yönetimi de dahil olmak üzere oturum açmış olan kullanıcı adına otomatik erişim belirteci yaşam süresi yönetimine sahiptir.

Daha fazla bilgi için, için BlazorDuende Erişim Belirteci Yönetimi belgelerine bakın.

Troubleshoot

Logging

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

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.
    • IP’nin uygulama kaydındaki Yönlendirme URI'sinde yapılandırılandan farklı bir portta uygulamayı çalıştırma. Microsoft Entra Kimliği ve bir geliştirme testi adresinde çalışan bir localhost uygulama için bağlantı noktası gerekli değildir, ancak uygulamanın bağlantı noktası yapılandırması ve uygulamanın çalıştırıldığı bağlantı noktası, diğer adresler localhost için eşleşmelidir.

    Bu makaledeki yapılandırma kapsamı, doğru yapılandırmanın örneklerini gösterir. Uygulama ve IP yanlış yapılandırmalarını kontrol ederek yapılandırmayı dikkatle inceleyin.

    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. allowPublicClient özniteliğininull veya true olarak 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 açma 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 'Birlikte 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
    • Argümanlar alanında, tarayıcının InPrivate veya Gizli modda açmak için kullandığı komut satırı seçeneğini belirtin. Bazı tarayıcılar uygulamanın URL'sini gerektirir.
      • Microsoft Edge'i kullanın -inprivate.
      • Google Chrome: --incognito --new-window {URL} yer tutucusunun URL'si olan {URL} ifadesini kullanın (örneğin, https://localhost:5001).
      • Mozilla Firefox: -private -url {URL}Yer tutucunun {URL} açıldığı URL olduğu yerde kullanın (ö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ğu üzerinden dotnet nuget locals all --clear komutunu ç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 Galerisi'ni kullanın.

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

Blazor Web Appsaniye:

  • Ön Uç için Arka Uç (BFF) desen örneklerinden biri için çözümü Aspire/Aspire.AppHost projeden 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