Aracılığıyla paylaş


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

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

Makalenin bu sürümü, Ö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 BFF düzenini benimsemeyi çağırıyorsa makale sürümü seçicisini BFF düzeniyle OIDC olarak değiştirin.

Aşağıdaki belirtim ele alınmıştır:

  • genel Blazor Web App 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 Web paketlerine dayanmaz ve örnek uygulama Için Microsoft Azure barındırma gerekmez. Identity Ancak örnek uygulama Entra, Microsoft Identity Web ile kullanılabilir ve Azure'da barındırılabilir.
  • Otomatik etkileşimli olmayan belirteç yenileme.
  • Veri için sunucu projesinde bir (web) API'sini güvenli bir şekilde çağırır.

Örnek uygulama

Örnek uygulama iki projeden oluşur:

  • BlazorWebAppOidc: hava durumu verileri için minimum API uç noktası örneği içeren öğesinin sunucu tarafı projesiBlazor Web App.
  • BlazorWebAppOidc.Client: öğesinin Blazor Web Appistemci tarafı projesi.

Aşağıdaki bağlantıyla deponun kökünden en son sürüm klasörü aracılığıyla örnek uygulamalara erişin. Projeler .NET 8 veya sonraki bir sürümün klasöründedir BlazorWebAppOidc .

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

Sunucu tarafı Blazor Web App projesi (BlazorWebAppOidc)

Proje BlazorWebAppOidc , sunucu tarafı projesidir Blazor Web App.

Dosya, BlazorWebAppOidc.http hava durumu veri isteğini test için kullanılabilir. BlazorWebAppOidc 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.

Not

Sunucu projesi, etkileşimli olarak işlenen bileşenler için hiçbir zaman kullanır IHttpContextAccessor/HttpContext. Daha fazla bilgi için bkz . ASP.NET Core Blazor etkileşimli sunucu tarafı işleme için tehdit azaltma kılavuzu.

Yapılandırma

Bu bölümde örnek uygulamanın nasıl yapılandırılır açıklanmaktadır.

Not

Microsoft Entra Id veya Azure AD B2C için, hem OIDC hem de kimlik doğrulama işleyicilerini uygun varsayılanlarla ekleyen Microsoft Identity Web'den (Microsoft.Identity.WebNuGet paketi, API belgeleri) kullanabilirsinizAddMicrosoftIdentityWebApp.Cookie Örnek uygulama ve bu bölümdeki 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 bağlı kaynaklara bakın.

İstemci gizli dizisini oluşturma

Uyarı

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

Yerel geliştirme testi için, sunucu uygulamasının istemci gizli dizisini yapılandırma anahtarı Authentication:Schemes:MicrosoftOidc:ClientSecretaltında depolamak için Gizli Dizi Yöneticisi aracını kullanın.

Not

Uygulama Microsoft Entra Id veya Azure AD B2C kullanıyorsa, Entra veya Azure portalında uygulamanın kaydında bir istemci gizli dizisi oluşturun (Sertifikaları yönetme>& gizli diziler>Yeni istemci gizli dizisi). Aşağıdaki kılavuzda yeni gizli dizinin Değerini kullanın.

Örnek uygulama Gizli Dizi Yöneticisi 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'da sunucu projesine sağ tıklayıp Kullanıcı Gizli Dizilerini Yönet'i seçerek gizli dizinin ayarlandığını onaylayabilirsiniz.

Uygulamayı yapılandırma

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

  • SignInScheme: Başarılı bir kimlik doğrulamasından sonra kullanıcının identity kalıcı olduğundan 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 profile () için kapsamlar openid (İsteğe bağlı): openid OIDC işleyicisinin çalışması gerektiğinden ve profile kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmaya Authentication:Schemes:MicrosoftOidc:Scope dahil edilirse bunların yeniden eklenmesiScope 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. Bu özellik, son kimlik doğrulamasının cookieboyutunu küçültmek için olarak ayarlanırfalse.

    oidcOptions.SaveTokens = false;
    
  • Çevrimdışı erişim kapsamı (Scope): offline_access Yenileme belirteci için 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}";
    

    Örnek:

    • Yetkili ({AUTHORITY}): https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/ (Kiracı Kimliğini aaaabbbb-0000-cccc-1111-dddd2222eeeekullanır)
    • İstemci Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444
    oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
    oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
    

    Microsoft Azure "ortak" yetkilisi örneği:

    "Ortak" yetkili, çok kiracılı uygulamalar için 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.

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

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaimsve yapılandırması NameClaimType RoleClaimType: Birçok OIDC sunucusu içinde ClaimTypesSOAP/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ü Microsoft Entra ID (ME-ID) için uygun olan "roles" olarak ayarlar. identity Daha fazla bilgi için sağlayıcınıza başvurun.

    Not

    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 ve /signout-callback-oidcşeklindedir/signin-oidc.

    • CallbackPath: Kullanıcının aracısının döndürüldüğü uygulamanın temel yolundaki istek yolu.

      Entra veya Azure portalında, Web platformu yapılandırmasının Yeniden Yönlendirme URI'sindeki yolu ayarlayın:

      https://localhost/signin-oidc

      Not

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

    • SignedOutCallbackPath: Sağlayıcı oturumu kapatıldıktan identity sonra kullanıcı aracısının döndürüldüğü uygulamanın temel yolu içindeki istek yolu.

      Entra veya Azure portalında, Web platformu yapılandırmasının Yeniden Yönlendirme URI'sindeki yolu ayarlayın:

      https://localhost/signout-callback-oidc

      Not

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

      Not

      Microsoft Identity Web kullanılıyorsa, sağlayıcı şu anda yalnızca Yetkili (https://login.microsoftonline.com/{TENANT ID}/v2.0/) kullanılıyorsa microsoftonline.com öğesine geri SignedOutCallbackPath yönlendirir. Microsoft Identity Web ile "ortak" Yetkili'yi kullanabiliyorsanız bu sınırlama mevcut değildir. Daha fazla bilgi için bkz . yetki url'si kiracı kimliği (AzureAD/microsoft-authentication-library-for-js #5783) içerdiğinde postLogoutRedirectUri çalışmıyor.

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

      Entra veya Azure portalında Ön kanal oturumu kapatma URL'sini ayarlayın:

      https://localhost/signout-oidc

      Not

      Microsoft Entra Id kullanılırken adresler için localhost bağlantı noktası gerekmez. Diğer OIDC sağlayıcılarının çoğu doğru bağlantı noktası 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 veren doğrulayıcı ile çalışır, ancak tarafından https://login.microsoftonline.com/common/v2.0/.well-known/openid-configurationdöndürülen Kiracı Kimliği ({TENANT ID}) ile parametrelendirilen vereni hesaba katmalıyız. Daha fazla bilgi için bkz . OpenID Connect ile SecurityTokenInvalidIssuerException ve Azure AD "ortak" uç noktası (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    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;
    

Örnek uygulama kodu

Aşağıdaki özellikler için örnek uygulamayı inceleyin:

  • Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.
  • Sunucu projesi, istemciye kimlik doğrulama durumunu akışla göndermek için kullanan PersistentComponentState bir sunucu tarafı kimlik doğrulama durumu sağlayıcısı eklemek için çağırırAddAuthenticationStateSerialization. İstemci, seri durumdan çıkarmak ve sunucu tarafından geçirilen kimlik doğrulama durumunu kullanmak için çağırır AddAuthenticationStateDeserialization . Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.
  • Hava durumu verilerine Blazor Web App yönelik örnek istekler, dosyadaki ProgramProgram.cs() En Az API uç noktası (/weather-forecast) tarafından işlenir. Uç nokta, çağrısı RequireAuthorizationyaparak yetkilendirme gerektirir. Projeye eklediğiniz tüm denetleyiciler için, özniteliğini [Authorize] denetleyiciye veya eyleme ekleyin.
  • Uygulama, hava durumu verileri için sunucu projesinde bir (web) API'sini güvenli bir şekilde çağırır:
    • Bileşen sunucuda işlenirken Weather , hava durumu verilerini doğrudan (web API çağrısı aracılığıyla değil) almak için sunucusundaki öğesini kullanır ServerWeatherForecaster .
    • Bileşen istemcide işlendiğinde, bileşen sunucu projesine ClientWeatherForecaster web API çağrısı yapmak için önceden yapılandırılmış HttpClient (istemci projesinin Program dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesinin Program dosyasında tanımlanan minimum API uç noktası (/weather-forecast), 'den ServerWeatherForecaster hava durumu verilerini alır ve verileri istemciye döndürür.
  • Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.
  • PersistingAuthenticationStateProvider() sınıfıPersistingAuthenticationStateProvider.cs, kimlik doğrulama durumunu istemciye akışla göndermek için kullanan PersistentComponentState bir sunucu tarafıdır AuthenticationStateProvider ve daha sonra WebAssembly uygulamasının ömrü boyunca sabittir.
  • Hava durumu verilerine Blazor Web App yönelik örnek istekler, dosyadaki ProgramProgram.cs() En Az API uç noktası (/weather-forecast) tarafından işlenir. Uç nokta, çağrısı RequireAuthorizationyaparak yetkilendirme gerektirir. Projeye eklediğiniz tüm denetleyiciler için, özniteliğini [Authorize] denetleyiciye veya eyleme ekleyin.
  • Uygulama, hava durumu verileri için sunucu projesinde bir (web) API'sini güvenli bir şekilde çağırır:
    • Bileşen sunucuda işlenirken Weather , hava durumu verilerini doğrudan (web API çağrısı aracılığıyla değil) almak için sunucusundaki öğesini kullanır ServerWeatherForecaster .
    • Bileşen istemcide işlendiğinde, bileşen sunucu projesine ClientWeatherForecaster web API çağrısı yapmak için önceden yapılandırılmış HttpClient (istemci projesinin Program dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesinin Program dosyasında tanımlanan minimum API uç noktası (/weather-forecast), 'den ServerWeatherForecaster hava durumu verilerini alır ve verileri istemciye döndü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.

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

Proje BlazorWebAppOidc.Client , istemci tarafı projesidir Blazor Web App.

İstemci, seri durumdan çıkarmak ve sunucu tarafından geçirilen kimlik doğrulama durumunu kullanmak için çağırır AddAuthenticationStateDeserialization . 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. Sonraki isteklerde sunucuda kimlik doğrulaması yapan belirteçler içermez ve bu belirteçler sunucuya yönelik isteklerde bulunan HttpClient bir cookie kullanılarak ayrı çalışır.

Makalenin bu sürümü, Ön Uç için Arka Uç (BFF) deseniyle OIDC'yi uygulamayı kapsar. Uygulamanın belirtimi BFF düzenini benimsemeyi çağırmıyorsa makale sürümü seçicisini BFF düzeni olmadan OIDC olarak değiştirin.

Aşağıdaki belirtim ele alınmıştır:

  • genel Blazor Web App 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 Web paketlerine dayanmaz ve örnek uygulama Için Microsoft Azure barındırma gerekmez. Identity Ancak örnek uygulama Entra, Microsoft Identity Web ile kullanılabilir ve Azure'da barındırılabilir.
  • Otomatik etkileşimli olmayan belirteç yenileme.
  • Ön Uç için Arka Uç (BFF) deseni, hizmet bulma ve arka uç uygulamasındaki bir hava durumu tahmin uç noktasına ara sunucu istekleri için YARP kullanılarak .NET Aspire benimsenir.
    • Arka uç web API'sinde oturum açmada cookietarafından Blazor Web App kaydedilen JWT belirteçlerini doğrulamak için JWT taşıyıcı kimlik doğrulaması kullanılı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 (Ancak Başka bir Ters Ara Sunucu), ters proxy sunucusu oluşturmak için kullanılan bir kitaplıktır.

hakkında .NET Aspiredaha fazla bilgi için bkz . Genel Kullanılabilirlik: .NET Aspire.NET Buluta Özel Geliştirmeyi Basitleştirme (Mayıs 2024).

Önkoşul

.NET AspireVisual Studio sürüm 17.10 veya üzerini gerektirir.

Örnek uygulama

Örnek uygulama beş projeden oluşur:

  • .NET 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 .NET 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: öğesinin Blazor Web Appsunucu tarafı projesi.
  • BlazorWebAppOidc.Client: öğesinin Blazor Web Appistemci tarafı projesi.

Aşağıdaki bağlantıyla deponun kökünden en son sürüm klasörü aracılığıyla örnek uygulamalara erişin. Projeler .NET 8 veya sonraki bir sürümün klasöründedir BlazorWebAppOidcBff .

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

.NET Aspire proje

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

önkoşullarını .NET Aspirekarşıladığınızdan emin olun. Daha fazla bilgi için Hızlı Başlangıç: İlk uygulamanızı derlemenin Önkoşullar bölümüne bakın.NET Aspire.

Ö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 (.NET Aspire .NET Aspire belgeler)..

Sunucu tarafı Blazor Web App projesi (BlazorWebAppOidc)

Proje BlazorWebAppOidc , sunucu tarafı projesidir Blazor Web App. Proje, arka uç web API'si projesindeki (MinimalApiJwt) access_token bir hava durumu tahmin uç noktasına isteklerin proxy'si için YARP kullanır ve kimlik doğrulamasında cookiedepolanır.

Dosya, BlazorWebAppOidc.http hava durumu veri isteğini test için kullanılabilir. BlazorWebAppOidc 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.

Not

Sunucu projesi, etkileşimli olarak işlenen bileşenler için hiçbir zaman kullanır IHttpContextAccessor/HttpContext. Daha fazla bilgi için bkz . ASP.NET Core Blazor etkileşimli sunucu tarafı işleme için tehdit azaltma kılavuzu.

Yapılandırma

Bu bölümde örnek uygulamanın nasıl yapılandırılır açıklanmaktadır.

Not

Microsoft Entra Id veya Azure AD B2C için, hem OIDC hem de kimlik doğrulama işleyicilerini uygun varsayılanlarla ekleyen Microsoft Identity Web'den (Microsoft.Identity.WebNuGet paketi, API belgeleri) kullanabilirsinizAddMicrosoftIdentityWebApp.Cookie Örnek uygulama ve bu bölümdeki 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 bağlı kaynaklara bakın.

İstemci gizli dizisini oluşturma

Uyarı

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

Yerel geliştirme testi için, sunucu uygulamasının istemci gizli dizisini yapılandırma anahtarı Authentication:Schemes:MicrosoftOidc:ClientSecretaltında depolamak için Gizli Dizi Yöneticisi aracını kullanın.

Not

Uygulama Microsoft Entra Id veya Azure AD B2C kullanıyorsa, Entra veya Azure portalında uygulamanın kaydında bir istemci gizli dizisi oluşturun (Sertifikaları yönetme>& gizli diziler>Yeni istemci gizli dizisi). Aşağıdaki kılavuzda yeni gizli dizinin Değerini kullanın.

Örnek uygulama Gizli Dizi Yöneticisi 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'da sunucu projesine sağ tıklayıp Kullanıcı Gizli Dizilerini Yönet'i seçerek gizli dizinin ayarlandığını onaylayabilirsiniz.

Uygulamayı yapılandırma

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

  • SignInScheme: Başarılı bir kimlik doğrulamasından sonra kullanıcının identity kalıcı olduğundan 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 profile () için kapsamlar openid (İsteğe bağlı): openid OIDC işleyicisinin çalışması gerektiğinden ve profile kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmaya Authentication:Schemes:MicrosoftOidc:Scope dahil edilirse bunların yeniden eklenmesiScope 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, arka uç web API projesinden (MinimalApiJwt ) hava durumu verilerine yönelik isteklerin kimliğini doğrulamak için olarak ayarlanırtrue.

    oidcOptions.SaveTokens = true;
    
  • Çevrimdışı erişim kapsamı (Scope): offline_access Yenileme belirteci için kapsam gereklidir.

    oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
    
  • Web API'sinden hava durumu verilerini alma kapsamları (Scope): KapsamWeather.Get, Azure veya Entra portalında API'yi kullanıma sunma altında yapılandırılır. Bu, arka uç web API'sinin projesinin (MinimalApiJwt) erişim belirtecini taşıyıcı JWT ile doğrulaması için gereklidir.

    oidcOptions.Scope.Add("{APP ID URI}/{API NAME}");
    

    Örnek:

    • Uygulama Kimliği URI'si ({APP ID URI}): https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
      • Dizin Adı ({DIRECTORY NAME}): contoso
      • Uygulama (İstemci) Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444
    • () MinimalApiJwt{API NAME}hava durumu verileri için yapılandırılan kapsam:Weather.Get
    oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444/Weather.Get");
    

    Yukarıdaki örnek, AAD B2C kiracı türüne sahip bir kiracıda kayıtlı bir uygulamayla ilişkilidir. Uygulama bir ME-ID kiracısında kayıtlıysa, Uygulama Kimliği URI'si farklıdır, bu nedenle kapsam farklıdır.

    Örnek:

    • Uygulama Kimliği URI'si ({APP ID URI}): api://{CLIENT ID} Uygulama (İstemci) Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444
    • () MinimalApiJwt{API NAME}hava durumu verileri için yapılandırılan kapsam:Weather.Get
    oidcOptions.Scope.Add("api://00001111-aaaa-2222-bbbb-3333cccc4444/Weather.Get");
    
  • Authority ve ClientId: OIDC çağrıları için Yetkili ve İstemci Kimliğini ayarlar.

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

    Örnek:

    • Yetkili ({AUTHORITY}): https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/ (Kiracı Kimliğini aaaabbbb-0000-cccc-1111-dddd2222eeeekullanır)
    • İstemci Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444
    oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
    oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
    

    Microsoft Azure "ortak" yetkilisi örneği:

    "Ortak" yetkili, çok kiracılı uygulamalar için 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.

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

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaimsve yapılandırması NameClaimType RoleClaimType: Birçok OIDC sunucusu içinde ClaimTypesSOAP/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ü Microsoft Entra ID (ME-ID) için uygun olan "roles" olarak ayarlar. identity Daha fazla bilgi için sağlayıcınıza başvurun.

    Not

    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 ve /signout-callback-oidcşeklindedir/signin-oidc.

    • CallbackPath: Kullanıcının aracısının döndürüldüğü uygulamanın temel yolundaki istek yolu.

      Entra veya Azure portalında, Web platformu yapılandırmasının Yeniden Yönlendirme URI'sindeki yolu ayarlayın:

      https://localhost/signin-oidc

      Not

      Adresler için localhost bağlantı noktası gerekli değildir.

    • SignedOutCallbackPath: Sağlayıcı oturumu kapatıldıktan identity sonra kullanıcı aracısının döndürüldüğü uygulamanın temel yolu içindeki istek yolu.

      Entra veya Azure portalında, Web platformu yapılandırmasının Yeniden Yönlendirme URI'sindeki yolu ayarlayın:

      https://localhost/signout-callback-oidc

      Not

      Adresler için localhost bağlantı noktası gerekli değildir.

      Not

      Microsoft Identity Web kullanılıyorsa, sağlayıcı şu anda yalnızca Yetkili (https://login.microsoftonline.com/{TENANT ID}/v2.0/) kullanılıyorsa microsoftonline.com öğesine geri SignedOutCallbackPath yönlendirir. Microsoft Identity Web ile "ortak" Yetkili'yi kullanabiliyorsanız bu sınırlama mevcut değildir. Daha fazla bilgi için bkz . yetki url'si kiracı kimliği (AzureAD/microsoft-authentication-library-for-js #5783) içerdiğinde postLogoutRedirectUri çalışmıyor.

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

      Entra veya Azure portalında Ön kanal oturumu kapatma URL'sini ayarlayın:

      https://localhost/signout-oidc

      Not

      Adresler için localhost bağlantı noktası gerekli değildir.

      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 veren doğrulayıcı ile çalışır, ancak tarafından https://login.microsoftonline.com/common/v2.0/.well-known/openid-configurationdöndürülen Kiracı Kimliği ({TENANT ID}) ile parametrelendirilen vereni hesaba katmalıyız. Daha fazla bilgi için bkz . OpenID Connect ile SecurityTokenInvalidIssuerException ve Azure AD "ortak" uç noktası (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    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;
    

Örnek uygulama kodu

Aşağıdaki özellikler için örnek uygulamayı inceleyin:

  • Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.
  • Sunucu projesi, istemciye kimlik doğrulama durumunu akışla göndermek için kullanan PersistentComponentState bir sunucu tarafı kimlik doğrulama durumu sağlayıcısı eklemek için çağırırAddAuthenticationStateSerialization. İstemci, seri durumdan çıkarmak ve sunucu tarafından geçirilen kimlik doğrulama durumunu kullanmak için çağırır AddAuthenticationStateDeserialization . Kimlik doğrulama durumu, WebAssembly uygulamasının ömrü boyunca sabittir.
  • öğesine Blazor Web App yönelik istekler arka uç web API'sinin projesine (MinimalApiJwt) eklenir. MapForwarder dosyasında, Program 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 sunucuda işlenirken Weather , kullanıcının erişim belirteciyle ServerWeatherForecaster hava durumu verileri isteğine ara sunucu sağlamak için öğesini kullanır.
    • Bileşen istemcide işlendiğinde, bileşen sunucu projesine ClientWeatherForecaster web API çağrısı yapmak için önceden yapılandırılmış HttpClient (istemci projesinin Program dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesinin Program dosyasında tanımlanan minimum API uç noktası (/weather-forecast), hava durumu verilerini almak için isteği kullanıcının erişim belirteciyle dönüştürür.
  • Özel cookie bir yenileyici (CookieOidcRefresher.cs ) yardımıyla otomatik etkileşimli olmayan belirteç yenilemesi.
  • PersistingAuthenticationStateProvider() sınıfıPersistingAuthenticationStateProvider.cs, kimlik doğrulama durumunu istemciye akışla göndermek için kullanan PersistentComponentState bir sunucu tarafıdır AuthenticationStateProvider ve daha sonra WebAssembly uygulamasının ömrü boyunca sabittir.
  • öğesine Blazor Web App yönelik istekler arka uç web API'sinin projesine (MinimalApiJwt) eklenir. MapForwarder dosyasında, Program 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 sunucuda işlenirken Weather , kullanıcının erişim belirteciyle ServerWeatherForecaster hava durumu verileri isteğine ara sunucu sağlamak için öğesini kullanır.
    • Bileşen istemcide işlendiğinde, bileşen sunucu projesine ClientWeatherForecaster web API çağrısı yapmak için önceden yapılandırılmış HttpClient (istemci projesinin Program dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesinin Program dosyasında tanımlanan minimum API uç noktası (/weather-forecast), 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.

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

Proje BlazorWebAppOidc.Client , istemci tarafı projesidir Blazor Web App.

İstemci, seri durumdan çıkarmak ve sunucu tarafından geçirilen kimlik doğrulama durumunu kullanmak için çağırır AddAuthenticationStateDeserialization . 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. Sonraki isteklerde sunucuda kimlik doğrulaması yapan belirteçler içermez ve bu belirteçler sunucuya yönelik isteklerde bulunan HttpClient bir cookie kullanılarak ayrı çalışır.

Arka uç web API'si projesi (MinimalApiJwt)

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

Yapılandırma

Projeyi, projenin JwtBearerOptions dosyasındaki AddJwtBearer çağrının Program içinde yapılandırın:

  • Audience: Alınan openID Connect belirtecinin Hedef Kitlesini ayarlar.

    Azure veya Entra portalında: Değeri yalnızca API'yi kullanıma sunma altında kapsamı eklerken yapılandırılan Uygulama Kimliği URI'sinin yolu ile eşleştirinWeather.Get:

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

    Örnek:

    Uygulama Kimliği URI'si ({APP ID URI}): https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}:

    • Dizin Adı ({DIRECTORY NAME}): contoso
    • Uygulama (İstemci) Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444
    jwtOptions.Audience = "https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444";
    

    Yukarıdaki örnek, AAD B2C kiracı türüne sahip bir kiracıda kayıtlı bir uygulamayla ilişkilidir. Uygulama bir ME-ID kiracısında kayıtlıysa, Uygulama Kimliği URI'si farklıdır, dolayısıyla hedef kitle farklıdır.

    Örnek:

    Uygulama Kimliği URI'si ({APP ID URI}): api://{CLIENT ID} Uygulama (İstemci) Kimliği ({CLIENT ID}): 00001111-aaaa-2222-bbbb-3333cccc4444

    jwtOptions.Audience = "api://00001111-aaaa-2222-bbbb-3333cccc4444";
    
  • Authority: OpenID Connect çağrıları yapmak için Yetkiliyi ayarlar. değerini içindeki OIDC işleyicisi için yapılandırılan Yetkili ile eşleştirin BlazorWebAppOidc/Program.cs:

    jwtOptions.Authority = "{AUTHORITY}";
    

    Örnek:

    Yetkili ({AUTHORITY}): https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/ (Kiracı Kimliğini aaaabbbb-0000-cccc-1111-dddd2222eeeekullanır)

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

    Yukarıdaki örnek, AAD B2C kiracı türüne sahip bir kiracıda kayıtlı bir uygulamayla ilişkilidir. Uygulama bir ME-ID kiracısında kayıtlıysa, yetkili sağlayıcı tarafından identity döndürülen JWT'nin sigortacıyla (iss) eşleşmelidir:

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

Hava durumu verileri için minimum API

Projenin Program dosyasında hava durumu tahmini veri uç noktasının güvenliğini sağlama:

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

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

Oturum kapatmada sayfaya home yeniden yönlendirme

Kullanıcı uygulamada gezindiğinde, LogInOrOut bileşen (Layout/LogInOrOut.razor) dönüş URL'si () için gizli bir alanı geçerli URL'nin (ReturnUrlcurrentURL) değerine ayarlar. Kullanıcı uygulama oturumunu kapattığında sağlayıcı, identity oturumu kapattığı sayfaya döndürür.

Kullanıcı güvenli bir sayfadan oturumunu kapatırsa, oturumu kapatıldıktan sonra yalnızca kimlik doğrulama işlemi aracılığıyla geri gönderilmek üzere aynı güvenli sayfaya geri döner. Kullanıcıların hesapları sık sık değiştirmesi gerektiğinde bu davranış normaldir. Ancak alternatif bir uygulama belirtimi, kullanıcının oturum kapatma sonrasında uygulamanın home sayfasına veya başka bir sayfaya döndürülmesi için çağrı yapabilir. Aşağıdaki örnekte, uygulamanın sayfasının oturum kapatma işlemleri için dönüş URL'si home olarak nasıl ayarlanacağı gösterilmektedir.

Bileşendeki LogInOrOut önemli değişiklikler aşağıdaki örnekte gösterilmiştir. Varsayılan yol bu olduğundan, sayfasına / ayarlanmış home için gizli bir alan ReturnUrl sağlamanıza gerek yoktur. IDisposable artık uygulanmadı. NavigationManager artık eklenmez. Bloğun tamamı @code kaldırılır.

Layout/LogInOrOut.razor:

@using Microsoft.AspNetCore.Authorization

<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 @context.User.Identity?.Name
                </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>

Ş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ğrulaması geliştirme ve test sırasında bir nonce hatası alırsanız, eski cookie veriler bir nonce hatasına yol açabileceğinden uygulamada 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.

Yeni bir erişim belirteci için yenileme belirteci değiştirildiğinde bir nonce gerekli değildir veya kullanılmaz. Örnek uygulamada, CookieOidcRefresher (CookieOidcRefresher.cs) kasıtlı olarak olarak olarak falseayarlarOpenIdConnectProtocolValidator.RequireNonce.

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

Bu bölüm, sağlayıcı olarak Microsoft Entra Id (ME-ID) kullanmayan uygulamalarla ilgiliidentity. 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) OpenIdConnectOptions Program.csyapılandırın:

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

Birçok OIDC identity sağlayıcısı için rol talep türü şeklindedir role. identity Doğru değer için 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 bilgisindeki grupları ve rolleri göndermek için ME-ID'yi yapılandırıyor. 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ı cookieboyutunu ş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'i uygulamak iç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).

içinde OpenIdConnectOptions Program.csrol talep türünü (TokenValidationParameters.RoleClaimType) 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 Uygulama rollerini uygulamanıza ekleme başlığındaki yönergeleri izleyin ve rolleri yapılandırmak ve atamak için bunları belirteçte (ME-ID belgeleri) alı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 bkz . Rol talebi yapılandırma (ME-ID belgeleri).

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ğini groupMembershipClaims olarak Allayarlayın. All Me-ID değeri, oturum açmış kullanıcının tüm güvenlik/dağıtım gruplarını (groupstalepler) ve rolleri (widstalepler) gönderir. Özniteliğini ayarlamak groupMembershipClaims için:

  1. Uygulamanın kaydını Azure portalında açın.
  2. Kenar çubuğunda Bildirimi Yönet'i>seçin.
  3. özniteliğini groupMembershipClaims 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 noktadaRazor, 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 grup için bir talep olan taleplerde groups görünür. Güvenlik grubu GUID'leri, bir güvenlik grubu oluşturduğunuzda Azure portalında görünür ve Genel Bakış>Grupları>Görünümü seçildiğinde Identity>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 ile gönderilir ve bir yönetici rolüne başvurmaz. Yönetici rolü GUID'leri (rol şablonu kimlikleri), Roller ve yöneticiler seçilirken Azure portalında görünür ve ardından üç nokta (...) >Listelenen rolün açıklaması. Rol şablonu kimlikleri, Microsoft Entra yerleşik rolleri (Entra belgeleri) içinde de listelenir.

Sorun giderme

Günlük Kaydı

Sunucu uygulaması standart bir ASP.NET Core uygulamasıdır. Sunucu uygulamasında daha düşük günlüğe kaydetme 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 içinBlazor WebAssembly, makale sürümü seçicisinin ASP.NET Core 7.0 veya üzeri olarak ayarlandığı ASP.NET Core Blazor günlüğünün İstemci tarafı kimlik doğrulama günlüğü bölümüne bakın.

Sık karşılaşılan hatalar

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

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

    • Senaryonun gereksinimlerine bağlı olarak, eksik veya yanlış bir Yetkili, Örnek, Kiracı Kimliği, Kiracı etki alanı, İstemci Kimliği veya Yeniden Yönlendirme URI'si bir uygulamanın istemcilerin kimliğini doğrulamasını engeller.
    • Yanlış istek kapsamları istemcilerin sunucu web API'leri uç noktalarına erişmesini engeller.
    • Hatalı veya eksik sunucu API'si izinleri istemcilerin sunucu web API'si uç noktalarına erişmesini engeller.
    • Uygulamayı IP'nin uygulama kaydının Yeniden Yönlendirme URI'sinde yapılandırılandan farklı bir bağlantı noktasında çalıştırma. Microsoft Entra Kimliği ve 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ı, adres olmayanlarlocalhost 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ırması arayarak yapılandırmayı dikkatle denetleyin.

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

    • Uygulama günlüklerini analiz edin.

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

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

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

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

  • ME-ID için yetkisiz istemci

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

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

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

    Hatayı düzeltmek için:

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

Tanımlama bilgileri 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 Gözat iletişim kutusunu açın.
    • Ekle düğmesini seçin.
    • Program alanında tarayıcınızın yolunu belirtin. Aşağıdaki yürütülebilir yollar Windows 10 için tipik yükleme konumlarıdır. Tarayıcınız farklı bir konumda yüklüyse veya Windows 10 kullanmıyorsanız, tarayıcının yürütülebilir dosyasının yolunu sağlayın.
      • Microsoft Edge: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Bağımsız Değişkenler alanında, tarayıcının InPrivate veya Gizli modda açmak için kullandığı komut satırı seçeneğini belirtin. Bazı tarayıcılar uygulamanın URL'sini gerektirir.
      • Microsoft Edge: kullanın -inprivate.
      • Google Chrome: Yer --incognito --new-window {URL}tutucunun {URL} açıldığı URL olduğu yerde 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 Core 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. Komut kabuğundan yürüterek dotnet nuget locals all --clear 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.

Not

Uygulamanın hedef çerçevesiyle uyumlu olmayan paket sürümlerinin kullanımı desteklenmez. Paket hakkında bilgi için NuGet Galerisi'ni veya FuGet Paket Gezgini'ni kullanın.

Sunucu uygulamasını çalıştırma

test ederken Blazor Web Appve sorun giderirken, uygulamayı sunucu projesinden çalıştırdığınızdan emin olun.

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