Güvenli ASP.NET Core sunucu tarafı Blazor uygulamaları
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Bu makalede, ASP.NET Core uygulamaları olarak sunucu tarafı Blazor uygulamalarının güvenliğini sağlama açıklanmaktadır.
Sunucu tarafı Blazor uygulamalar, ASP.NET Core uygulamalarıyla aynı şekilde güvenlik için yapılandırılır. Daha fazla bilgi için, ASP.NET Core güvenlik konuları altındaki makalelere bakın.
Kimlik doğrulama bağlamı yalnızca uygulama başlatıldığında oluşturulur; bu, uygulamanın WebSocket'e ilk bağlandığı zamandır. Kimlik doğrulama bağlamı, bağlantı hattının ömrü boyunca korunur. Uygulamalar, şu anda varsayılan olarak her 30 dakikada bir kullanıcının kimlik doğrulama durumunu düzenli aralıklarla yeniden doğrular.
Uygulamanın özel hizmetler için kullanıcıları yakalaması veya kullanıcı güncelleştirmelerine tepki vermesi gerekiyorsa bkz . Sunucu tarafı ASP.NET Çekirdek Blazor ek güvenlik senaryoları.
Blazor her sayfa gezintisinde s ile cookieyeni HTTP isteklerinde bulunan geleneksel sunucu tarafından işlenmiş web uygulamalarından farklıdır. Gezinti olayları sırasında kimlik doğrulaması denetlendi. Ancak, cookiebu işe dahil değildir. Cookies yalnızca bir sunucuya HTTP isteği gönderirken gönderilir. Bu, kullanıcı uygulamada Blazor gezindiğinde böyle olmaz. Gezinti sırasında kullanıcının kimlik doğrulama durumu bağlantı hattı içinde Blazor denetlenerek özetini kullanarak RevalidatingAuthenticationStateProvider
sunucuda istediğiniz zaman güncelleştirebilirsiniz.
Önemli
Gezinti sırasında kimlik doğrulamasını gerçekleştirmek için özel NavigationManager
uygulama önerilmez. Uygulamanın gezinti sırasında özel kimlik doğrulama durumu mantığı yürütmesi gerekiyorsa, özel AuthenticationStateProvider
bir kullanın.
Not
Bu makaledeki kod örnekleri, .NET 6 veya sonraki sürümlerindeki ASP.NET Core'da desteklenen null atanabilir başvuru türlerini (NTS) ve .NET derleyici null durum statik analizini benimser. ASP.NET Core 5.0 veya önceki sürümleri hedeflerken, bu makaledeki örneklerden null tür atamasını (?
) kaldırın.
Proje şablonu
ASP.NET CoreBlazor için Araç oluşturma başlığındaki yönergeleri izleyerek yeni bir sunucu tarafı Blazor uygulaması oluşturun.
Sunucu tarafı uygulama şablonunu seçtikten ve projeyi yapılandırdıktan sonra Kimlik doğrulama türü altında uygulamanın kimlik doğrulamasını seçin:
- Hiçbiri (varsayılan): Kimlik doğrulaması yok.
- Bireysel Hesaplar: Kullanıcı hesapları, ASP.NET Core Identitykullanılarak uygulama içinde depolanır.
- Hiçbiri (varsayılan): Kimlik doğrulaması yok.
- Bireysel Hesaplar: Kullanıcı hesapları, ASP.NET Core Identitykullanılarak uygulama içinde depolanır.
- Microsoft kimlik platformu: Daha fazla bilgi için bkz. ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.
- Windows: Windows Kimlik Doğrulama'sı kullanın.
BlazorIdentity Kullanıcı Arabirimi (Bireysel Hesaplar)
Blazor, Tek Tek Hesaplar için kimlik doğrulama seçeneğini belirlediğinizde tam Blazortabanlı Identity kullanıcı arabirimi oluşturmayı destekler.
Blazor Web Uygulaması şablonu, SQL Server veritabanı kodunun iskelesini oluştururIdentity. Komut satırı sürümü varsayılan olarak SQLite kullanır ve için Identitybir SQLite veritabanı içerir.
Şablon aşağıdakileri işler:
- Kullanıcıları oturum açma ve kapatma gibi rutin kimlik doğrulama görevleri için bileşenler ve ilgili mantık ekler IdentityRazor .
- Identity Bileşenler, hesap onayı ve parola kurtarma ve üçüncü taraf bir uygulama kullanarak çok faktörlü kimlik doğrulaması gibi gelişmiş Identity özellikleri de destekler.
- Etkileşimli sunucu tarafı işleme (etkileşimli SSR) ve istemci tarafı işleme (CSR) senaryoları desteklenir.
- Identityİlgili paketleri ve bağımlılıkları ekler.
- içindeki paketlere Identity başvurur
_Imports.razor
. - Özel bir kullanıcı Identity sınıfı (
ApplicationUser
) oluşturur. - Bir EF Core veritabanı bağlamı (
ApplicationDbContext
) oluşturur ve kaydeder. - Yerleşik Identity uç noktalar için yönlendirmeyi yapılandırılır.
- Doğrulamayı ve iş mantığını içerir Identity .
Çerçevenin Blazor Identity bileşenlerini incelemek için, web uygulaması proje şablonundaki Pages
(başvuru kaynağı) klasörün ve Shared
klasörlerinde Account
Blazor bu bileşenlere erişin.
Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler Web Uygulamasının ana projesindeki Blazor sunucuda statik olarak işlenir.
Çerçeve, kullanıcının kimlik doğrulama durumunu tarayıcıya akışı için hem sunucu hem de istemci (.Client
) projelerinde özel AuthenticationStateProvider bir özellik sağlar. sunucu projesi öğesini çağırırken AddAuthenticationStateSerialization
istemci projesi de öğesini çağırır AddAuthenticationStateDeserialization
. İstemci yerine sunucuda kimlik doğrulaması, uygulamanın ön kayıt sırasında ve çalışma zamanı başlatılmadan önce kimlik doğrulama durumuna erişmesine Blazor WebAssembly olanak tanır. Özel AuthenticationStateProvider uygulamalar, kimlik doğrulama durumunu HTML açıklamalarına seri hale getirmek ve ardından yeni AuthenticationState bir örnek oluşturmak için WebAssembly'den geri okumak için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır. Daha fazla bilgi için Web Apps'te Blazor kimlik doğrulama durumunu yönetme bölümüne bakın.
Yalnızca Etkileşimli Sunucu çözümleri için ( IdentityRevalidatingAuthenticationStateProvider
başvuru kaynağı), etkileşimli bir bağlantı hattının bağlı olduğu her 30 dakikada bir bağlı kullanıcı için güvenlik damgasını yeniden belirten bir sunucu tarafıdır AuthenticationStateProvider .
Etkileşimli WebAssembly veya Etkileşimli Otomatik işleme modlarını seçtiğinizde, sunucu tüm kimlik doğrulama ve yetkilendirme isteklerini işler ve Identity bileşenler Web Uygulamasının ana projesindeki Blazor sunucuda statik olarak işlenir. Proje şablonu, sunucu ve tarayıcı arasında kullanıcının kimlik doğrulama durumunu eşitlemek için projeye bir PersistentAuthenticationStateProvider
sınıf (başvuru kaynağı) .Client
içerir. sınıfı özel bir uygulamasıdır AuthenticationStateProvider. Sağlayıcı, kimlik doğrulama durumunu önceden yüklemek ve sayfada kalıcı hale getirmek için Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanır.
Web Uygulamasının Blazor ana projesinde, kimlik doğrulama durumu sağlayıcısı (başvuru kaynağı) (Yalnızca sunucu etkileşim çözümleri) veyaPersistingRevalidatingAuthenticationStateProvider
(başvuru kaynağı) (WebAssembly veya Otomatik etkileşim çözümleri) olarak adlandırılır IdentityRevalidatingAuthenticationStateProvider
.
BlazorIdentity, bir fabrika tarafından oluşturulmayan örneklere bağlıdırDbContext. Bu durum, proje şablonunun Identity bileşenlerinin etkileşimi desteklemeden statik olarak işlenmesi için yeterli olduğu için kasıtlı DbContext olarak gerçekleştirilir.
Genel etkileşimli işleme modlarının bileşenler dışındakiIdentity bileşenlere nasıl uygulandığına ve aynı zamanda bileşenler için statik SSR'ye nasıl uygulandığına Identity ilişkin bir açıklama için bkz . ASP.NET Çekirdek Blazor işleme modları.
Önceden oluşturulmuş durumu kalıcı hale döndürme hakkında daha fazla bilgi için bkz . Prerender ASP.NET Core Razor bileşenleri.
Kullanıcı arabirimi hakkında BlazorIdentity daha fazla bilgi ve dış oturum açma bilgilerini sosyal web siteleri aracılığıyla tümleştirme yönergeleri için bkz . .NET 8'de kimlikle ilgili yenilikler.
Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
Web Apps'te Blazor kimlik doğrulama durumunu yönetme
Bu bölüm, şunları benimseyen Web Uygulamaları için Blazor geçerlidir:
- Tek Tek Hesaplar
- İstemci tarafı işleme (CSR, WebAssembly tabanlı etkileşim).
İstemci tarafı kimlik doğrulama durumu sağlayıcısı yalnızca içinde Blazor kullanılır ve ASP.NET Core kimlik doğrulama sistemiyle tümleşik değildir. Ön kayıt sırasında, Blazor sayfada tanımlanan meta verileri dikkate alır ve kullanıcının kimliğinin doğrulanıp doğrulanmadığını belirlemek için ASP.NET Core kimlik doğrulama sistemini kullanır. Kullanıcı bir sayfadan diğerine geçtiğinde, istemci tarafı kimlik doğrulama sağlayıcısı kullanılır. Kullanıcı sayfayı yenilediğinde (tam sayfa yeniden yükleme), istemci tarafı kimlik doğrulama durumu sağlayıcısı sunucudaki kimlik doğrulama kararına dahil olmaz. Kullanıcının durumu sunucu tarafından kalıcı olmadığından, istemci tarafında tutulan herhangi bir kimlik doğrulama durumu kaybolur.
Bunu ele almak için en iyi yaklaşım, ASP.NET Core kimlik doğrulama sisteminde kimlik doğrulaması gerçekleştirmektir. İstemci tarafı kimlik doğrulama durumu sağlayıcısı yalnızca kullanıcının kimlik doğrulama durumunu yansıtmayı üstlenir. Kimlik doğrulama durumu sağlayıcılarıyla bunu gerçekleştirmeye yönelik örnekler Web Uygulaması proje şablonu tarafından Blazor gösterilmiştir ve aşağıda açıklanmıştır.
Sunucu projesinin Program
dosyasında, Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak sunucu tarafı AuthenticationStateProvider tarafından döndürülenleri seri hale AuthenticationState getiren öğesini çağırınAddAuthenticationStateSerialization
:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
Varsayılan olarak, API yalnızca tarayıcıdaki erişim için sunucu tarafı adını ve rol taleplerini serileştirir. Tüm talepleri dahil etmek için true
sunucu tarafı çağrısında olarak AddAuthenticationStateSerialization
ayarlayınSerializeAllClaims
:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
İstemci () projesinin Program
dosyasında çağrısıAddAuthenticationStateDeserialization
, öğesini çağırarak ve Kalıcı Bileşen Durumu hizmetini (PersistentComponentState) kullanarak AuthenticationStateData
sunucudan seri durumdan çıkarıldığı yeri AuthenticationState AuthenticationStateProvider ekler..Client
Sunucu projesinde öğesine karşılık gelen bir çağrı AddAuthenticationStateSerialization
olmalıdır.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
PersistingRevalidatingAuthenticationStateProvider
(başvuru kaynağı): Etkileşimli sunucu tarafı işlemeyi (etkileşimli SSR) ve istemci tarafı işlemeyi (CSR) benimseyen Web Uygulamaları için Blazor . Bu, etkileşimli bir devrenin bağlı olduğu her 30 dakikada bir bağlı kullanıcının güvenlik damgasını yeniden belirten bir sunucu tarafıdır AuthenticationStateProvider . Ayrıca, istemciye kimlik doğrulama durumunu akışla göndermek için Kalıcı Bileşen Durumu hizmetini kullanır ve bu hizmet CSR'nin ömrü boyunca sabittir.PersistingServerAuthenticationStateProvider
(başvuru kaynağı): Yalnızca CSR kullanan Web Uygulamaları için Blazor . Bu, istemciye kimlik doğrulama durumunu akışla göndermek için Kalıcı Bileşen Durumu hizmetini kullanan bir sunucu tarafıdır AuthenticationStateProvider ve bu durum CSR'nin ömrü boyunca düzeltilir.PersistentAuthenticationStateProvider
(başvuru kaynağı): CSR'i benimseyen Web Uygulamaları için Blazor . Bu, sunucuda işlendiğinde sayfada kalıcı olan verileri arayarak kullanıcının kimlik doğrulama durumunu belirleyen bir istemci tarafıdır AuthenticationStateProvider . Bu kimlik doğrulama durumu CSR'nin ömrü boyunca sabittir. Kullanıcının oturum açması veya kapatması gerekiyorsa, tam sayfa yeniden yükleme gerekir. Bu yalnızca görüntüleme amacıyla bir kullanıcı adı ve e-posta sağlar. Sunucuya yönelik isteklerde bulunanHttpClient
bir cookie kullanılarak ayrı olarak işlenen sonraki isteklerde sunucuda kimlik doğrulaması yapan belirteçler içermez.
Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
İskele Identity
Sunucu tarafı bir uygulamada iskele oluşturma Identity hakkında daha fazla bilgi için bkz. ASP.NET Core projelerinde iskeleIdentity.Blazor
Sunucu tarafı Blazor uygulamasına iskele Identity oluşturun:
Dış sağlayıcılardan gelen ek talepler ve belirteçler
Dış sağlayıcılardan gelen ek talepleri depolamak için, bkz. ASP.NET Core dış sağlayıcılardan gelen ek talepleri ve belirteçleri kalıcı hale getirme.
Identity Server ile Linux üzerinde Azure App Service
Identity Server ile Linux üzerinde Azure App Service dağıtılırken sertifikayı vereni açıkça belirtin. Daha fazla bilgi için bkz. SPA'lar için Web API arka ucu güvenliğini sağlamak için kullanmaIdentity.
Özel AuthenticationStateProvider
uygulama
Uygulama özel bir sağlayıcı gerektiriyorsa uygulayın AuthenticationStateProvider ve geçersiz kılın GetAuthenticationStateAsync.
Aşağıdaki örnekte, tüm kullanıcıların kimliği kullanıcı adıyla mrfibuli
doğrulanır.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, "mrfibuli"),
}, "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Hizmet CustomAuthStateProvider
dosyaya Program
kaydedilir:
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
CustomAuthStateProvider
Hizmet, çağrısından Program
AddServerSideBlazorsonra dosyasına kaydedilir:
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddServerSideBlazor();
...
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
CustomAuthStateProvider
hizmeti çağrısından AddServerSideBlazorStartup.cs
sonra içinde Startup.ConfigureServices
kaydedilir:
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddServerSideBlazor();
...
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Bileşeni onaylayın veya bileşene Router ekleyinAuthorizeRouteView.
Routes
bileşeninde (Components/Routes.razor
):
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Dosyadaki Program
hizmet koleksiyonuna basamaklı kimlik doğrulama durumu hizmetleri ekleyin:
builder.Services.AddCascadingAuthenticationState();
Not
Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden Blazor uygulama Blazor oluşturduğunuzda, uygulama ve AuthorizeRouteView çağrısı AddCascadingAuthenticationStateiçerir. Daha fazla bilgi için, makalenin Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme bölümünde sunulan ek bilgilerle ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme bölümüne bakın.
Bileşene Router bir AuthorizeRouteView ve CascadingAuthenticationState öğesini onaylayın veya ekleyin:
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Not
Kimlik doğrulaması etkinleştirilmiş proje şablonlarından birinden uygulama Blazor oluşturduğunuzda, uygulama önceki örnekte gösterilen ve CascadingAuthenticationState bileşenlerini içerirAuthorizeRouteView.Blazor Daha fazla bilgi için, makalenin Yönlendirici bileşeniyle yetkisiz içeriği özelleştirme bölümünde sunulan ek bilgilerle ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme bölümüne bakın.
, AuthorizeView kimliği doğrulanmış kullanıcının adını herhangi bir bileşende gösterir:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
kullanımıyla AuthorizeViewilgili yönergeler için bkz . ASP.NET Çekirdek Blazor kimlik doğrulaması ve yetkilendirme.
Kimlik doğrulaması durumu değişiklikleri hakkında bildirim
Bir özel AuthenticationStateProvider
, tüketicilere kimlik doğrulama durumu değişikliğinin rerender olarak bildirilmesi için temel sınıfta çağrılabilir NotifyAuthenticationStateChanged AuthenticationStateProvider .
Aşağıdaki örnek, Özel AuthenticationStateProvider uygulama bölümündeki yönergeleri izleyerek özel AuthenticationStateProvider
uygulama işlemini temel alır.
Aşağıdaki CustomAuthStateProvider
uygulama, AuthenticateUser
bir kullanıcıda oturum açmak ve tüketicilere kimlik doğrulama durumu değişikliğini bildirmek için özel bir yöntemi kullanıma sunar.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
public void AuthenticateUser(string userIdentifier)
{
var identity = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
}, "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
Bir bileşende:
- öğesini ekleme AuthenticationStateProvider.
- Kullanıcının tanımlayıcısını tutmak için bir alan ekleyin.
- öğesinin yayınını AuthenticationStateProvider yapmak ve kullanıcının tanımlayıcısıyla çağırmak
AuthenticateUser
içinCustomAuthStateProvider
bir düğme ve yöntem ekleyin.
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
Önceki yaklaşım, özel bir hizmet aracılığıyla kimlik doğrulama durumu değişiklikleri bildirimlerini tetikleme amacıyla geliştirilebilir. Aşağıdaki CustomAuthenticationService
sınıf, geçerli kullanıcının talep sorumlusunu, olayın çağırdığı NotifyAuthenticationStateChangedabone olabileceği bir olayla () bir yedekleme alanındacurrentUser
(UserChanged
) AuthenticationStateProvider tutar. Bu bölümün devamında ek yapılandırmayla, CustomAuthenticationService
öğesini olayı tetiklemesi UserChanged
için ayarlayan CurrentUser
mantığı olan bir bileşene eklenebilir.
using System.Security.Claims;
public class CustomAuthenticationService
{
public event Action<ClaimsPrincipal>? UserChanged;
private ClaimsPrincipal? currentUser;
public ClaimsPrincipal CurrentUser
{
get { return currentUser ?? new(); }
set
{
currentUser = value;
if (UserChanged is not null)
{
UserChanged(currentUser);
}
}
}
}
Program
dosyasında, bağımlılık ekleme kapsayıcısında öğesini CustomAuthenticationService
kaydedin:
builder.Services.AddScoped<CustomAuthenticationService>();
Startup.cs
içinde Startup.ConfigureServices
öğesini bağımlılık ekleme kapsayıcısında kaydedinCustomAuthenticationService
:
services.AddScoped<CustomAuthenticationService>();
Aşağıdakiler CustomAuthStateProvider
olaya abonedir CustomAuthenticationService.UserChanged
. GetAuthenticationStateAsync
kullanıcının kimlik doğrulama durumunu döndürür. Başlangıçta, kimlik doğrulama durumu değerini CustomAuthenticationService.CurrentUser
temel alır. Kullanıcıda bir değişiklik olduğunda, çağrısı için GetAuthenticationStateAsync
yeni kullanıcıyla (new AuthenticationState(newUser)
) yeni bir kimlik doğrulama durumu oluşturulur:
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
private AuthenticationState authenticationState;
public CustomAuthStateProvider(CustomAuthenticationService service)
{
authenticationState = new AuthenticationState(service.CurrentUser);
service.UserChanged += (newUser) =>
{
authenticationState = new AuthenticationState(newUser);
NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
};
}
public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
Task.FromResult(authenticationState);
}
Aşağıdaki bileşenin SignIn
yöntemi, kullanıcının tanımlayıcısının üzerinde CustomAuthenticationService.CurrentUser
ayarlanacağı bir talep sorumlusu oluşturur:
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
},
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
new[]
{
new Claim(ClaimTypes.Name, userIdentifier),
},
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Kapsamı bir bileşen olan hizmetler için ekleme AuthenticationStateProvider
Doğru başlatılmamış yeni bir örneğinin AuthenticationStateProvider oluşturulmasıyla sonuçlanan özel bir kapsam içinde çözümlemeye AuthenticationStateProvider çalışma.
Kapsamı bir bileşen olan bir hizmet içinde öğesine erişmek AuthenticationStateProvider için, yönergesini @inject
veya [Inject]
özniteliğini ekleyin AuthenticationStateProvider ve bunu bir parametre olarak hizmete geçirin. Bu yaklaşım, doğru, başlatılan örneğinin AuthenticationStateProvider her kullanıcı uygulaması örneği için kullanılmasını sağlar.
ExampleService.cs
:
public class ExampleService
{
public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
return $"{user.Identity.Name} is authenticated.";
}
else
{
return "The user is NOT authenticated.";
}
}
}
Hizmeti kapsamlı olarak kaydedin. Sunucu tarafı Blazor bir uygulamada, kapsamı belirlenmiş hizmetlerin ömrü istemci bağlantı devresinin süresine eşittir.
Program
dosyasında:
builder.Services.AddScoped<ExampleService>();
Startup.cs
içindeStartup.ConfigureServices
:
services.AddScoped<ExampleService>();
Aşağıdaki InjectAuthStateProvider
bileşeninde:
- Bileşeni devralır OwningComponentBase.
- AuthenticationStateProvider eklenir ve öğesine
ExampleService.ExampleMethod
geçirilir. ExampleService
ve ile OwningComponentBase.ScopedServices GetRequiredServiceçözümlenir. Bu, kullanıcının devresinin ömrü boyunca var olan doğru, başlatılan örneğiniExampleService
döndürür.
InjectAuthStateProvider.razor
:
@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
Daha fazla bilgi için ASP.NET Core Blazor bağımlılık ekleme kılavuzuna OwningComponentBase bakın.
Özel bir içerikle önceden giriş yaparken yetkisiz içerik görüntüleniyor AuthenticationStateProvider
Bir AuthenticationStateProvider
bileşendekiAuthorizeView
içerik gibi yetkisiz içeriklerin özel bir içerikle ön oturum açma sırasında gösterilmesini önlemek için aşağıdaki yaklaşımlardan birini benimseyin:
Prerendering'i desteklemek üzere özel için uygulamaIHostEnvironmentAuthenticationStateProvider: örnek IHostEnvironmentAuthenticationStateProvideruygulaması için,'de
ServerAuthenticationStateProvider.cs
çerçevenin ServerAuthenticationStateProvider uygulamasına Blazor (başvuru kaynağı)AuthenticationStateProvider bakın.Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
Ön kayıt özelliğini devre dışı bırakma: Uygulamanın bileşen hiyerarşisinde kök bileşen olmayan en üst düzey bileşende olarak ayarlanmış
false
parametreyleprerender
işleme modunu belirtin.Not
Kök bileşeni etkileşimli hale getirme (bileşen gibi
App
) desteklenmez. Bu nedenle, prerendering bileşeni tarafındanApp
doğrudan devre dışı bırakılamaz.Web Uygulaması proje şablonunu temel alan Blazor uygulamalar için, bileşenin bileşeninde
App
(Components/App.razor
) kullanıldığı önRoutes
kayıt genellikle devre dışı bırakılır:<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Ayrıca, bileşen için
HeadOutlet
ön kayıt özelliğini devre dışı bırakın:<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Bileşen örneğine uygulanan
Routes
işleme modunu seçmeli olarak denetleyebilirsiniz. Örneğin bkz . ASP.NET Çekirdek Blazor işleme modları.
Ön kayıt özelliğini devre dışı bırakma: Dosyayı açın
_Host.cshtml
ve Bileşen Etiketi Yardımcısı'nın özniteliğini olarak Serverdeğiştirinrender-mode
:<component type="typeof(App)" render-mode="Server" />
- Uygulama başlamadan önce kullanıcının kimliğini doğrulama: Bu yaklaşımı benimsemek için, uygulamanın kullanıcının ilk isteğine tabanlı oturum açma sayfasıyla Identityyanıt vermesi veya kimlik doğrulaması yapılana kadar uç noktalara Blazor yönelik istekleri görüntülemesi ve engellemesi gerekir. Daha fazla bilgi için bkz . Yetkilendirmeyle korunan kullanıcı verileriyle ASP.NET Core uygulaması oluşturma. Kimlik doğrulamasından sonra, önceden oluşturulmuş Razor bileşenlerdeki yetkisiz içerik yalnızca kullanıcının içeriği görüntüleme yetkisinin gerçekten yetkisi olmadığında gösterilir.
Kullanıcı durumu yönetimi
Addaki "state" sözcüğüne rağmen, AuthenticationStateProvider genel kullanıcı durumunu depolamak için değildir. AuthenticationStateProvider yalnızca kullanıcının uygulamada kimlik doğrulama durumunu, uygulamada oturum açıp açmadığını ve kim olarak oturum açtığını gösterir.
Kimlik doğrulaması, Sayfalar ve MVC uygulamalarıyla aynı ASP.NET Core Identity kimlik doğrulamasını Razor kullanır. ASP.NET Core Identity için depolanan kullanıcı durumu, uygulamaya ek kod eklemeden akışı Blazor yapılır. Özelliklerin uygulamanın bölümlerinde etkili olması için Identity ASP.NET Core Identity makalelerindeki ve öğreticilerindeki Blazor yönergeleri izleyin.
ASP.NET Core Identitydışında genel durum yönetimi hakkında yönergeler için bkz . ASP.NET Core Blazor durum yönetimi.
Ek güvenlik soyutlamaları
Kimlik doğrulama durumunu yönetmeye iki ek soyutlama daha katılır:
ServerAuthenticationStateProvider (başvuru kaynağı): AuthenticationStateProvider Çerçeve tarafından sunucudan Blazor kimlik doğrulama durumunu almak için kullanılan.
RevalidatingServerAuthenticationStateProvider(başvuru kaynağı): Konak ortamından Blazor bir kimlik doğrulama durumu almak ve düzenli aralıklarla yeniden doğrulamak için çerçeve tarafından kullanılan hizmetler için AuthenticationStateProvider bir temel sınıf.
Varsayılan 30 dakikalık yeniden doğrulama aralığı (
Areas/Identity/RevalidatingIdentityAuthenticationStateProvider.cs
) içindeRevalidatingIdentityAuthenticationStateProvider
ayarlanabilir. Aşağıdaki örnek aralığı 20 dakikaya kısaltır:protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
Oturum kapatma sırasında kimlik doğrulama durumu yönetimi
Sunucu tarafı Blazor , tarayıcı sekmeleri de dahil olmak üzere bağlantı hattının kullanım ömrü boyunca kullanıcı kimlik doğrulama durumunu kalıcı hale gelir. Kullanıcı bir sekmede oturumu kapattığında bir kullanıcıyı tarayıcı sekmeleri arasında proaktif olarak kapatmak için kısa bir RevalidationIntervalile bir RevalidatingServerAuthenticationStateProvider (başvuru kaynağı) uygulamanız gerekir.
Not
.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılan listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).
Geçici yeniden yönlendirme URL'si geçerlilik süresi
Bu bölüm Web Apps için Blazor geçerlidir.
RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Sunucu tarafı işleme tarafından Blazor yayılan geçici yeniden yönlendirme URL'leri için veri koruma geçerlilik ömrünü almak veya ayarlamak için seçeneğini kullanın. Bunlar yalnızca geçici olarak kullanıldığından, yalnızca bir istemcinin URL'yi alması ve gezinmeye başlaması için yaşam süresi yeterli olmalıdır. Ancak, sunucular arasında saat dengesizliği için izin verecek kadar uzun olmalıdır. Varsayılan değer beş dakikadır.
Aşağıdaki örnekte değer yedi dakikaya uzatılır:
builder.Services.AddRazorComponents(options =>
options.TemporaryRedirectionUrlValidityDuration =
TimeSpan.FromMinutes(7));
Ek kaynaklar
- Hızlı Başlangıç: Microsoft ile ASP.NET Core web uygulamasına oturum açma ekleme
- Hızlı Başlangıç: Microsoft kimlik platformu ile ASP.NET Core web API'sini koruma
- ASP.NET Core'ı ara sunucularla ve yük dengeleyicilerle çalışacak şekilde yapılandırma: Aşağıdakilere ilişkin yönergeler içerir:
- Ara sunucular ve iç ağlar arasında HTTPS şeması bilgilerini korumak için İletilen Üst Bilgiler Ara Yazılımını kullanma.
- El ile düzen yapılandırması, doğru istek yönlendirme için istek yolu değişiklikleri ve Linux ve IIS dışı ters ara sunucular için istek şemasını iletme gibi ek senaryolar ve kullanım örnekleri.
ASP.NET Core