Share via


OpenID Bağlan (OIDC) ile ASP.NET Core Blazor Web Uygulamasının güvenliğini sağlama

Bu makalede, GitHub deposunda (.NET 8 veya üzeri) örnek bir uygulama kullanarak OpenID Bağlan (OIDC) ile web uygulamasının dotnet/blazor-samples güvenliğini Blazor sağlama (indirme) açıklanmaktadır.

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:

  • Web Uygulaması, Blazor genel etkileşimle 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 Web Uygulamasının sunucu tarafı projesiBlazor.
  • BlazorWebAppOidc.Client: Web Uygulamasının Blazor istemci 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 Uygulaması projesi (BlazorWebAppOidc)

Proje BlazorWebAppOidc , Web Uygulamasının Blazor sunucu tarafı projesidir.

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

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 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 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 varsayılan olarak 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/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (Kiracı Kimliğini a3942615-d115-4eb7-bc84-9974abcf5064kullanır)
    • İstemci Kimliği ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    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/";
    
  • ClientSecret: OIDC istemci gizli dizisi.

    Aşağıdaki örnek yalnızca test ve tanıtım amaçlıdır. İstemci gizli dizisini uygulamanın derlemesinde depolamayın veya gizli diziyi kaynak denetiminde denetlemeyin. İstemci gizli dizisini Kullanıcı Gizli Dizileri, Azure Key Vault veya bir ortam değişkeninde depolayın.

    Kimlik doğrulama düzeni yapılandırması, yer tutucunun {SCHEME NAME} varsayılan olarak düzen MicrosoftOidc olduğu bölümünden otomatik olarak okunurbuilder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"]. Yapılandırma önceden yapılandırıldığından, bir istemci gizli dizisi yapılandırma anahtarı aracılığıyla Authentication:Schemes:MicrosoftOidc:ClientSecret otomatik olarak okunabilir. Ortam değişkenlerini kullanan sunucuda ortam değişkenini Authentication__Schemes__MicrosoftOidc__ClientSecretolarak adlandırın:

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Yalnızca gösterim ve test için doğrudan ClientSecret ayarlanabilir. Dağıtılan üretim uygulamaları için değeri doğrudan ayarlamayın. Biraz daha iyi güvenlik için, çizgiyi koşullu olarak şu simgeyle derleyinDEBUG:

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Örnek:

    gizli dizi ({CLIENT SECRET}): 463471c8c4...f90d674bc9 (görüntü için kısaltıldı)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • 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 kaydı yapılandırmasında, Erişim belirteçlerini veya kimlik belirteçlerini döndürmek için yetkilendirme uç noktasının 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ı NameClaimTypeRoleClaimType: 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, ad ve rol taleplerini el ile eşler:

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 = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • 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: Uygulamanın temel yolu içinde, kimlik sağlayıcısında oturum kapatıldıktan sonra kullanıcı aracısının döndürüldüğü 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 Bağlan 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.
  • 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 verileri için Web Uygulaması'na Blazor yönelik örnek istekler, dosyadaki ProgramProgram.cs() bir Minimum 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.

Web Apps'te Blazor hizmet 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 Uygulaması projesi (BlazorWebAppOidc.Client)

Proje BlazorWebAppOidc.Client , Web Uygulamasının Blazor istemci tarafı projesidir.

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:

  • Web Uygulaması, Blazor genel etkileşimle 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 için .NET Aspire ve arka uç uygulamasındaki bir hava durumu tahmin uç noktasına ara sunucu istekleri için YARP kullanılarak benimsenir.
    • Arka uç web API'sinde, Web Uygulaması tarafından Blazor oturum açmada cookiekaydedilen 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.

Önizleme paketi uyarısı

Uyarı

Örnek uygulama tarafından BlazorWebAppOidcBff kullanılan ve bu makalede açıklanan teknolojiler ve paketler şu anda önizleme sürümündedir. Makalenin içeriği, API ve örnek uygulama şu anda desteklenmez ve şu anda üretim kullanımı için önerilmez. Örnek uygulama ve kılavuz bildirimde bulunmadan değiştirilebilir.

Önkoşul

.NET Aspire için Visual Studio sürüm 17.10 veya üzeri gerekir.

Ö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: Web Uygulamasının Blazor sunucu tarafı projesi.
  • BlazorWebAppOidc.Client: Web Uygulamasının Blazor istemci 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 projeleri

.NET Aspire kullanma hakkında daha fazla bilgi ve örnek uygulamanın ve projeleriyle ilgili .AppHost ayrıntılar için .NET Aspire belgelerine bakın..ServiceDefaults

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

Sunucu tarafı Blazor Web Uygulaması projesi (BlazorWebAppOidc)

Proje BlazorWebAppOidc , Web Uygulamasının Blazor sunucu tarafı projesidir. 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 ve 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.

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 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 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}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • () MinimalApiJwt{API NAME}hava durumu verileri için yapılandırılan kapsam:Weather.Get
    oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/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}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • () MinimalApiJwt{API NAME}hava durumu verileri için yapılandırılan kapsam:Weather.Get
    oidcOptions.Scope.Add("api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/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/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (Kiracı Kimliğini a3942615-d115-4eb7-bc84-9974abcf5064kullanır)
    • İstemci Kimliği ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    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/";
    
  • ClientSecret: OIDC istemci gizli dizisi.

    Aşağıdaki örnek yalnızca test ve tanıtım amaçlıdır. İstemci gizli dizisini uygulamanın derlemesinde depolamayın veya gizli diziyi kaynak denetiminde denetlemeyin. İstemci gizli dizisini Kullanıcı Gizli Dizileri, Azure Key Vault veya bir ortam değişkeninde depolayın.

    Kimlik doğrulama düzeni yapılandırması, yer tutucunun {SCHEME NAME} varsayılan olarak düzen MicrosoftOidc olduğu bölümünden otomatik olarak okunurbuilder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"]. Yapılandırma önceden yapılandırıldığından, bir istemci gizli dizisi yapılandırma anahtarı aracılığıyla Authentication:Schemes:MicrosoftOidc:ClientSecret otomatik olarak okunabilir. Ortam değişkenlerini kullanan sunucuda ortam değişkenini Authentication__Schemes__MicrosoftOidc__ClientSecretolarak adlandırın:

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Yalnızca gösterim ve test için doğrudan ClientSecret ayarlanabilir. Dağıtılan üretim uygulamaları için değeri doğrudan ayarlamayın. Biraz daha iyi güvenlik için, çizgiyi koşullu olarak şu simgeyle derleyinDEBUG:

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Örnek:

    gizli dizi ({CLIENT SECRET}): 463471c8c4...f90d674bc9 (görüntü için kısaltıldı)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • 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 kaydı yapılandırmasında, Erişim belirteçlerini veya kimlik belirteçlerini döndürmek için yetkilendirme uç noktasının 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ı NameClaimTypeRoleClaimType: 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, ad ve rol taleplerini el ile eşler:

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 = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • 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: Uygulamanın temel yolu içinde, kimlik sağlayıcısında oturum kapatıldıktan sonra kullanıcı aracısının döndürüldüğü 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 Bağlan 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.
  • 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.
  • Web Uygulamasına yönelik Blazor istekler arka uç web API'sinin projesine (MinimalApiJwt) yöneliktir. 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.

Web Apps'te Blazor hizmet 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 Uygulaması projesi (BlazorWebAppOidc.Client)

Proje BlazorWebAppOidc.Client , Web Uygulamasının Blazor istemci tarafı projesidir.

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. Web App sunucu tarafı projesinden Blazor (BlazorWebAppOidc) gelen istekler projeye eklenir MinimalApiJwt .

Yapılandırma

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

  • Audience: Alınan tüm OpenID Bağlan 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}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    jwtOptions.Audience = "https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    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}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f

    jwtOptions.Audience = "api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    
  • Authority: OpenID Bağlan çağrıları yapma yetkisini 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/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (Kiracı Kimliğini a3942615-d115-4eb7-bc84-9974abcf5064kullanır)

    jwtOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/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 kimlik sağlayıcısı tarafından döndürülen JWT'nin sağlayıcıyla (iss) eşleşmelidir:

    jwtOptions.Authority = "https://sts.windows.net/a3942615-d115-4eb7-bc84-9974abcf5064/";
    

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 giriş sayfasına 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, kimlik sağlayıcısı bu kullanıcıyı 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 kapatmadan sonra uygulamanın giriş sayfasına veya başka bir sayfaya döndürülmesi için çağrı yapabilir. Aşağıdaki örnekte, uygulamanın giriş sayfasının oturum kapatma işlemleri için dönüş URL'si olarak nasıl ayarlanacağı gösterilmektedir.

Bileşendeki LogInOrOut önemli değişiklikler aşağıdaki örnekte gösterilmiştir. value için ReturnUrl gizli alanın adı, konumundaki /giriş sayfasına ayarlanır. 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 />
                <input type="hidden" name="ReturnUrl" value="/" />
                <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 s ve site verileri bölümüne bakın.Cookie

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.

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 ya da 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.

Cookies ve site verileri

Cookies 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çmaları cookie
  • Uygulamalar cookie
  • Önbelleğe alınan ve depolanan site verileri

Kalan cookies 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

Web Uygulamasını test ederken ve sorunlarını giderirken Blazor 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.Count() > 0)
{
    <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