OpenID Connect (OIDC) ile ASP.NET Core Blazor Web Uygulamasının güvenliğini sağlama
Bu makalede, GitHub deposunda (.NET 8 veya üzeri) bir örnek uygulama kullanarak OpenID Connect (OIDC) ile bir 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.Web
NuGet 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 kapsamlaropenid
(İsteğe bağlı):openid
OIDC işleyicisinin çalışması gerektiğinden veprofile
kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmayaAuthentication: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ır
false
.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ğinia3942615-d115-4eb7-bc84-9974abcf5064
kullanı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/";
- Yetkili (
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üzenMicrosoftOidc
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ığıylaAuthentication:Schemes:MicrosoftOidc:ClientSecret
otomatik olarak okunabilir. Ortam değişkenlerini kullanan sunucuda ortam değişkeniniAuthentication__Schemes__MicrosoftOidc__ClientSecret
olarak 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 derleyin
DEBUG
:#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 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. Daha fazla bilgi için kimlik 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 = JwtRegisteredClaimNames.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: 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ıyorsamicrosoftonline.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-configuration
dö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. 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
Program
Program.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ırServerWeatherForecaster
. - 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 projesininProgram
dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesininProgram
dosyasında tanımlanan minimum API uç noktası (/weather-forecast
), 'denServerWeatherForecaster
hava durumu verilerini alır ve verileri istemciye döndürür.
- Bileşen sunucuda işlenirken
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.
.NET Aspire hakkında daha fazla bilgi için bkz . .NET Aspire Genel Kullanılabilirliği: .NET Buluta Özel Geliştirmeyi Basitleştirme (Mayıs, 2024).
Ö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.
Ö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 . .NET Aspire'de güvenli olmayan aktarıma izin verme (.NET Aspire belgeleri).
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.Web
NuGet 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 kapsamlaropenid
(İsteğe bağlı):openid
OIDC işleyicisinin çalışması gerektiğinden veprofile
kapsamları da varsayılan olarak yapılandırılır, ancak kapsamlar yapılandırmayaAuthentication: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): Kapsam
Weather.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
- Dizin Adı (
- ()
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");
- Uygulama Kimliği URI'si (
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ğinia3942615-d115-4eb7-bc84-9974abcf5064
kullanı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/";
- Yetkili (
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üzenMicrosoftOidc
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ığıylaAuthentication:Schemes:MicrosoftOidc:ClientSecret
otomatik olarak okunabilir. Ortam değişkenlerini kullanan sunucuda ortam değişkeniniAuthentication__Schemes__MicrosoftOidc__ClientSecret
olarak 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 derleyin
DEBUG
:#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 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. Daha fazla bilgi için kimlik 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 = JwtRegisteredClaimNames.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: 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ıyorsamicrosoftonline.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-configuration
dö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. 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 belirteciyleServerWeatherForecaster
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 projesininProgram
dosyasında) kullanan hizmet uygulamasını kullanır. Sunucu projesininProgram
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.
- Bileşen sunucuda işlenirken
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 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ştirin
Weather.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";
- Dizin Adı (
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/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/
(Kiracı Kimliğinia3942615-d115-4eb7-bc84-9974abcf5064
kullanı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.
Etkileşimli sunucu tarafı işlemeyi benimseyen bileşenler ekleme
Uygulama bileşen aracılığıyla genel Etkileşimli Otomatik işleme kullandığındanRoutes
, bileşen tanım dosyasında.razor
() etkileşimli sunucu tarafı işleme (etkileşimli SSR, @rendermode InteractiveServer
) belirten tek tek bileşenler projenin Pages
klasörüne yerleştirilir.Client
.
Etkileşimli SSR bileşenlerinin .Client
projeye yerleştirilmesi sezgisel değildir çünkü bu bileşenler yalnızca sunucuda işlenir.
Sunucu projesinin Components/Pages
klasörüne etkileşimli bir SSR bileşeni yerleştirirseniz, bileşen normal olarak önceden oluşturulur ve kullanıcının tarayıcısında kısa bir süre görüntülenir. Ancak istemci tarafı yönlendirici, bileşeni bulamıyor ve sonuçta tarayıcıda 404 - Bulunamadı sonucunu elde ediyor.
Bu nedenle, etkileşimli SSR bileşenlerini .Client
projenin Pages
klasörüne yerleştirin.
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 (ReturnUrl
currentURL
) 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 false
ayarlarOpenIdConnectProtocolValidator.RequireNonce.
Microsoft Entra'ya kayıtlı olmayan uygulamalar için uygulama rolleri (ME-ID)
Bu bölüm, kimlik sağlayıcısı olarak Microsoft Entra Id (ME-ID) kullanmayan uygulamalarla ilgili. ME-ID ile kaydedilen uygulamalar için Microsoft Entra (ME-ID) ile kaydedilen uygulamalar için uygulama rolleri bölümüne bakın.
içinde rol talep türünü (TokenValidationParameters.RoleClaimType) OpenIdConnectOptions Program.cs
yapılandırın:
oidcOptions.TokenValidationParameters.RoleClaimType = "{ROLE CLAIM TYPE}";
Birçok OIDC kimlik sağlayıcısı için rol talep türü şeklindedir role
. Doğru değer için kimlik sağlayıcınızın belgelerine bakın.
projedeki UserInfo
sınıfını BlazorWebAppOidc.Client
aşağıdaki sınıfla değiştirin.
UserInfo.cs
:
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;
namespace BlazorWebAppOidc.Client;
// Add properties to this class and update the server and client
// AuthenticationStateProviders to expose more information about
// the authenticated user to the client.
public sealed class UserInfo
{
public required string UserId { get; init; }
public required string Name { get; init; }
public required string[] Roles { get; init; }
public const string UserIdClaimType = "sub";
public const string NameClaimType = "name";
private const string RoleClaimType = "role";
public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
new()
{
UserId = GetRequiredClaim(principal, UserIdClaimType),
Name = GetRequiredClaim(principal, NameClaimType),
Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
.ToArray(),
};
public ClaimsPrincipal ToClaimsPrincipal() =>
new(new ClaimsIdentity(
Roles.Select(role => new Claim(RoleClaimType, role))
.Concat([
new Claim(UserIdClaimType, UserId),
new Claim(NameClaimType, Name),
]),
authenticationType: nameof(UserInfo),
nameType: NameClaimType,
roleType: RoleClaimType));
private static string GetRequiredClaim(ClaimsPrincipal principal,
string claimType) =>
principal.FindFirst(claimType)?.Value ??
throw new InvalidOperationException(
$"Could not find required '{claimType}' claim.");
}
Bu noktada, Razor bileşenler rol tabanlı ve ilke tabanlı yetkilendirmeyi benimseyebilir. Uygulama rolleri, her rol için bir talep olan taleplerde role
görünür.
Microsoft Entra'ya kayıtlı uygulamalar için uygulama rolleri (ME-ID)
Microsoft Entra ID (ME-ID) kullanan uygulamalar için uygulama rollerini, ME-ID güvenlik gruplarını ve ME-ID yerleşik yönetici rollerini uygulamak için bu bölümdeki kılavuzu kullanın.
içinde OpenIdConnectOptions Program.cs
rol talep türünü (TokenValidationParameters.RoleClaimType) yapılandırın. değerini olarak roles
ayarlayı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 All
ayarlayın. All
Me-ID değeri, oturum açmış kullanıcının tüm güvenlik/dağıtım gruplarını (groups
talepler) ve rolleri (wids
talepler) gönderir. Özniteliğini ayarlamak groupMembershipClaims
için:
- Uygulamanın kaydını Azure portalında açın.
- Kenar çubuğunda Bildirimi Yönet'i>seçin.
- özniteliğini
groupMembershipClaims
bulun. - değeri
All
olarak ayarlayın("groupMembershipClaims": "All"
. - 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ğerib79fbf4d-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:
- Google Chrome (Google belgeleri)
- Microsoft Edge
- Mozilla Firefox (Mozilla belgeleri)
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:
- Azure portalında uygulamanın bildirimine erişin.
- özniteliğini
allowPublicClient
veyatrue
olaraknull
ayarlayın.
- Hata:
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
- Microsoft Edge:
- 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
).
- Microsoft Edge: kullanın
- 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:
- Komut kabuğundan yürüterek
dotnet nuget locals all --clear
yerel sistemin NuGet paket önbelleklerini temizleyin. - Proje
bin
veobj
klasörlerini silin. - Projeyi geri yükleyin ve yeniden oluşturun.
- 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
AzureAD/microsoft-identity-web
GitHub deposu: Örnek uygulamaların bağlantıları ve ilgili Azure belgeleri de dahil olmak üzere Microsoft Entra Id için Microsoft Web ve ASP.NET Core uygulamaları için Azure Active Directory B2C'yi uygulamaya Identity yönelik yararlı yönergeler. Şu anda Web Apps, Blazor Azure belgeleri tarafından açıkça ele alınmıyor, ancak ME-ID ve Azure barındırma için Web Uygulamasının Blazor kurulumu ve yapılandırması tüm ASP.NET Core web uygulamalarıyla aynıdır.AuthenticationStateProvider
hizmet- Web Apps'te Blazor kimlik doğrulama durumunu yönetme
- OIDC ile Interactive Server'da Blazor http isteği sırasında belirteci yenileme (
dotnet/aspnetcore
#55213)
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin