Blazor WebAssemblysunucu ile ASP.NET Core barındırılan bir uygulamanın güvenliğini sağlama Identity
Bu makalede, kullanıcıların ve API çağrılarının kimliğini doğrulamak için Duende Identity Server kullanan bir barındırılan Blazor WebAssembly çözümün nasıl oluşturulacağı açıklanmaktadır.
Önemli
Duende yazılımı , Duende sunucusunun üretim kullanımı için bir lisans ücreti ödemeniz gerekebilir Identity . Daha fazla bilgi için bkz. ASP.NET Core 5.0'dan 6.0'a geçiş.
Not
Tek başına veya barındırılan bir Blazor WebAssembly uygulamayı var olan bir dış sunucu örneğini kullanacak şekilde yapılandırmak için Identity içindeki yönergeleri izleyin Kimlik doğrulama ASP.NET Core Blazor WebAssembly tek başına bir uygulamanın güvenliğini sağlama .
Blazor WebAssemblyKimlik doğrulama mekanizmasına sahip yeni bir proje oluşturmak için:
Yeni bir proje oluşturma.
Blazor WebAssembly Uygulama şablonunu seçin. İleri’yi seçin.
kesik çizgi kullanmadan bir Project adı sağlayın (aşağıdaki uyarıya bakın). Konumun doğru olduğundan emin olun. İleri’yi seçin.
Uyarı
-Proje adında, OıDC uygulama tanımlayıcısının boyutunu kesen tireler () kullanmaktan kaçının. Blazor WebAssemblyProje şablonundaki mantık, çözümün yapılandırmasındaki OIDC uygulama tanımlayıcısı için proje adını kullanır. Pascal Case (BlazorSample) veya alt çizgi (Blazor_Sample), kabul edilebilir alternatiflerdir. Daha fazla bilgi için bkz. barındırılan bir Blazor WebAssembly Proje adı kesmesi OIDC güvenliğine ilişkin çizgiler (DotNet/aspnetcore #35337).ek bilgi iletişim kutusunda, ASP.NET Core sistemini kullanarak uygulama içinde kullanıcıları depolamak için kimlik doğrulama türü olarak bireysel hesaplar ' ı seçin Identity .
ASP.NET Core barındırılan onay kutusunu seçin.
Server Uygulama yapılandırması
Aşağıdaki bölümlerde, kimlik doğrulama desteği dahil edildiğinde projenin eklemeleri açıklanır.
Başlangıç sınıfı
StartupSınıfı aşağıdaki eklemeleri içerir.
Program.csiçinde:ASP.NET Core Identity:
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite( Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();IdentityAddApiAuthorizationsunucu üstünde varsayılan ASP.NET Core kuralları ayarlayan ek bir yardımcı yöntemi olan sunucu Identity :
builder.Services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();AddIdentityServerJwtSunucu tarafından ÜRETILEN JWT belirteçlerini doğrulamak üzere uygulamayı yapılandıran ek bir yardımcı yöntem ile kimlik doğrulaması Identity :
builder.Services.AddAuthentication() .AddIdentityServerJwt();
Program.csiçinde:Identitysunucu ara sunucusu, openıd Bağlan (oıdc) uç noktalarını kullanıma sunar:
app.UseIdentityServer();Kimlik doğrulama ara yazılımı, istek kimlik bilgilerini doğrulamadan ve Kullanıcı istek bağlamında ayarlamaktan sorumludur:
app.UseAuthentication();Yetki ara yazılımı yetkilendirme özelliklerini sunar:
app.UseAuthorization();
Linux üzerinde Azure App Service
Sertifikayı Linux üzerinde Azure App Service dağıtım sırasında açıkça belirtin. Daha fazla bilgi için bkz. ASP.NET Core'de Tek Sayfalı Uygulamalar için kimlik doğrulamasına giriş.
Addadpiauthorization
AddApiAuthorizationyardımcı yöntemi, ASP.NET Core senaryolar için Identity sunucuyu yapılandırır. Identity Sunucu, uygulama güvenliği sorunlarını işlemeye yönelik güçlü ve genişletilebilir bir çerçevedir. IdentitySunucu, en yaygın senaryolar için gereksiz karmaşıklık sunar. Sonuç olarak, iyi bir başlangıç noktası düşüntiğimiz bir dizi kural ve yapılandırma seçeneği sağlanır. Kimlik doğrulama gereksinimleriniz değiştikçe, sunucunun tam gücü, Identity kimlik doğrulamasını uygulamanın gereksinimlerine uyacak şekilde özelleştirmek için kullanılabilir.
IdentityServerjwt Ekle
AddIdentityServerJwtYardımcı yöntemi, varsayılan kimlik doğrulama işleyicisi olarak uygulama için bir ilke düzeni yapılandırır. İlke, Identity URL alanındaki herhangi bir alt yolda yönlendirilen tüm istekleri işlemeye izin verecek şekilde yapılandırılmıştır Identity /Identity . JwtBearerHandlerDiğer tüm istekleri işler. Ayrıca, bu yöntem:
- Bir
{APPLICATION NAME}APIAPI kaynağını sunucu ile Identity varsayılan kapsamına kaydeder{APPLICATION NAME}API. - Uygulama için sunucu tarafından verilen belirteçleri doğrulamak üzere JWT taşıyıcı belirteç ara yazılımını yapılandırır Identity .
Dalgalı bir denetleyici
WeatherForecastController() İçinde Controllers/WeatherForecastController.cs , [Authorize] özniteliği sınıfına uygulanır. Özniteliği, kullanıcıya kaynağa erişim için varsayılan ilkeye göre yetkilendirilmiş olması gerektiğini belirtir. Varsayılan yetkilendirme ilkesi, tarafından ayarlanan varsayılan kimlik doğrulama düzenini kullanacak şekilde yapılandırılır AddIdentityServerJwt . Yardımcı yöntemi, JwtBearerHandler uygulamaya yönelik istekler için varsayılan işleyici olarak yapılandırır.
ApplicationDbContext
ApplicationDbContext() İçinde Data/ApplicationDbContext.cs , DbContext ApiAuthorizationDbContext<TUser> sunucu için şemayı içerecek şekilde genişletilir Identity . ApiAuthorizationDbContext<TUser> , öğesinden türetilir IdentityDbContext .
Veritabanı şemasının tam denetimini elde etmek için, kullanılabilir Identity DbContext sınıflardan birini ve Identity yöntemi metodunu çağırarak şemayı içerecek şekilde yapılandırın builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value) OnModelCreating .
Oıdcconfigurationcontroller
OidcConfigurationController() İçinde Controllers/OidcConfigurationController.cs , istemci uç noktası OIDC parametrelerine hizmeti sunacak şekilde sağlanır.
Uygulama ayarları
Proje kökündeki uygulama ayarları dosyasında ( appsettings.json ), IdentityServer bölümünde yapılandırılan istemcilerin listesi açıklanmaktadır. Aşağıdaki örnekte, tek bir istemci vardır. İstemci adı, uygulama adına karşılık gelir ve kural tarafından OAuth ClientId parametresine eşlenir. Profil, yapılandırılan uygulama türünü gösterir. Profil, sunucu için yapılandırma işlemini basitleştiren kuralları yönlendirmek için dahili olarak kullanılır.
"IdentityServer": {
"Clients": {
"{APP ASSEMBLY}.Client": {
"Profile": "IdentityServerSPA"
}
}
}
Yer tutucu, {APP ASSEMBLY} uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Client Uygulama yapılandırması
Kimlik doğrulama paketi
Bireysel kullanıcı hesapları () kullanmak üzere bir uygulama oluşturulduğunda Individual , uygulama otomatik olarak Microsoft.AspNetCore.Components.WebAssembly.Authentication uygulamanın proje dosyasındaki paket için bir paket başvurusu alır. Paket, uygulamanın kullanıcıların kimliğini doğrulamasına ve korunan API 'Leri çağırmak için belirteçleri almasına yardımcı olan bir dizi temel sunar.
Bir uygulamaya kimlik doğrulaması ekliyorsanız, paketi uygulamanın proje dosyasına el ile ekleyin:
<PackageReference
Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication"
Version="{VERSION}" />
yer tutucu için {VERSION} , paketin, uygulamanın paylaşılan framework sürümüyle eşleşen en son kararlı sürümü, NuGet. orgkonumundaki paketin sürüm geçmişinde bulunabilir.
HttpClient yapılandırmada
' De Program.cs , bir adlandırılmış HttpClient (), {APP ASSEMBLY}.ServerAPI HttpClient sunucu API 'sine istek yaparken erişim belirteçlerini içeren örnekler sağlamak üzere yapılandırılır:
builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI",
client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("{APP ASSEMBLY}.ServerAPI"));
Yer tutucu, {APP ASSEMBLY} uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Not
Bir Blazor WebAssembly uygulamayı barındırılan bir çözümün parçası olmayan var olan bir Identity sunucu örneğini kullanacak şekilde yapılandırıyorsanız Blazor , HttpClient temel adres kaydını IWebAssemblyHostEnvironment.BaseAddress ( builder.HostEnvironment.BaseAddress ) konumundan sunucu uygulamasının API yetkilendirme uç noktası URL 'sine değiştirin.
API yetkilendirme desteği
Kullanıcıları kimlik doğrulama desteği, paket içinde sunulan genişletme yöntemi tarafından hizmet kapsayıcısına takılır Microsoft.AspNetCore.Components.WebAssembly.Authentication . Bu yöntem, uygulamanın mevcut yetkilendirme sistemiyle etkileşimde bulunmak için gereken hizmetleri ayarlar.
builder.Services.AddApiAuthorization();
Varsayılan olarak, uygulamanın yapılandırması tarafından kural tarafından yüklenir _configuration/{client-id} . Kural gereği, istemci KIMLIĞI uygulamanın derleme adına ayarlanır. Bu URL, aþýrý yükleme seçeneklerini çağırarak ayrı bir uç noktaya işaret etmek üzere değiştirilebilir.
Dosya içeri aktarmalar
Microsoft.AspNetCore.Components.AuthorizationAd alanı, uygulama boyunca dosya aracılığıyla kullanılabilir hale getirilir _Imports.razor :
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared
Dizin sayfası
Dizin sayfası ( wwwroot/index.html ) sayfası JavaScript içinde tanımlayan bir komut dosyası içerir AuthenticationService . AuthenticationService OıDC protokolünün alt düzey ayrıntılarını işler. Uygulama, kimlik doğrulama işlemlerini gerçekleştirmek için komut dosyasında tanımlanan yöntemleri dahili olarak çağırır.
<script src="_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/
AuthenticationService.js"></script>
Uygulama bileşeni
Bileşeni App ( ) uygulamalarda bulunan App.razor App bileşene Blazor Server benzer:
- Bileşeni, CascadingAuthenticationState uygulamanın geri AuthenticationState kalanına ifşayı yönetir.
- Bileşen, AuthorizeRouteView geçerli kullanıcının belirli bir sayfaya erişme yetkisine sahip olduğundan veya başka bir şekilde bileşeni işlemeye yetkili olduğundan emin
RedirectToLoginolur. - Bileşen,
RedirectToLoginyetkisiz kullanıcıları oturum açma sayfasına yeniden yönlendirmeyi yönetir.
ASP.NET Core'nin yayınlarında çerçevede yapılan değişikliklerden dolayı, bu bölümde Razor App bileşenin ( App.razor ) işaretlemesi gösterilmez. Bileşenin verilen bir sürüme yönelik işaretlemelerini incelemek için aşağıdaki yaklaşımlardan birini kullanın:
Kullanmak istediğiniz uygulamanın sürümü için varsayılan proje şablonundan kimlik Blazor WebAssembly doğrulaması için ASP.NET Core bir uygulama oluşturun. Oluşturulan
Appuygulamada bileşeniApp.razor( ) inceleme.Başvuru
AppkaynağındaApp.razorbileşeni ( ) inceleme.Not
Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal
mainASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Corerelease/5.05.0 sürümü için dalı seçin.
RedirectToLogin bileşeni
RedirectToLoginBileşen ( Shared/RedirectToLogin.razor ):
- Yetkisiz kullanıcıların oturum açma sayfasına yeniden yönlendirildiğini yönetir.
- Kimlik doğrulaması başarılı olursa bu sayfaya döndürülmeleri için kullanıcının erişmeye çalışan geçerli URL 'YI korur.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo(
$"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
}
}
LoginDisplay bileşeni
LoginDisplayBileşen ( Shared/LoginDisplay.razor ) MainLayout bileşende () içinde işlenir Shared/MainLayout.razor ve aşağıdaki davranışları yönetir:
- Kimliği doğrulanmış kullanıcılar için:
- Geçerli kullanıcı adını görüntüler.
- içinde kullanıcı profili sayfasına bir bağlantı ASP.NET Core Identity sunar.
- Uygulamada oturumun açık olduğu bir düğme sunar.
- Anonim kullanıcılar için:
- Kaydolma seçeneği sunar.
- Oturum açma seçeneği sunar.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager
<AuthorizeView>
<Authorized>
<a href="authentication/profile">Hello, @context.User.Identity.Name!</a>
<button class="nav-link btn btn-link" @onclick="BeginSignOut">
Log out
</button>
</Authorized>
<NotAuthorized>
<a href="authentication/register">Register</a>
<a href="authentication/login">Log in</a>
</NotAuthorized>
</AuthorizeView>
@code {
private async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
}
Kimlik doğrulama bileşeni
Bileşeni ( ) tarafından Authentication üretilen Pages/Authentication.razor sayfa, farklı kimlik doğrulama aşamalarını işleme için gereken yolları tanımlar.
RemoteAuthenticatorViewBileşen:
- Paketi tarafından
Microsoft.AspNetCore.Components.WebAssembly.Authenticationsağlanır. - Kimlik doğrulamasının her aşamasında uygun eylemleri gerçekleştirmeyi yönetir.
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
<RemoteAuthenticatorView Action="@Action" />
@code {
[Parameter]
public string Action { get; set; }
}
FetchData bileşeni
Bileşen FetchData şunların nasıl olduğunu gösterir:
- Erişim belirteci sağlama.
- Sunucu uygulamasında korumalı bir kaynak API'sini aramak için erişim belirteci kullanın.
@attribute [Authorize]yönergesi, yetkilendirme sistemine kullanıcının bu bileşeni ziyaret etmek için Blazor WebAssembly yetkilendirilmiş olması gerektiğini gösterir. Uygulamada özniteliğinin Client olması, sunucu üzerinde API'nin düzgün kimlik bilgileri olmadan çağrılması engellemez. Uygulamanın Server bunları doğru şekilde korumak için uygun uç noktaları da [Authorize] kullanması gerekir.
IAccessTokenProvider.RequestAccessToken , API'yi çağırma isteğine eklen bir erişim belirteci isteğiyle ilgilenmeyi sağlar. Belirteç önbelleğe alınmışsa veya hizmet kullanıcı etkileşimi olmadan yeni bir erişim belirteci sağlandı ise, belirteç isteği başarılı olur. Aksi takdirde, belirteç isteği deyiminde AccessTokenNotAvailableException yakalanan ile başarısız try-catch olur.
İstekte yer alan gerçek belirteci elde etmek için, uygulamanın çağırarak isteğin başarılı olup olduğunu denetlemesi tokenResult.TryGetToken(out var token) gerekir.
İstek başarılı olursa, belirteç değişkeni erişim belirteci ile doldurulur. AccessToken.ValueBelirteci özelliği, istek üst bilgisinde yer alan değişmez Authorization dizeyi gösterir.
belirteç kullanıcı etkileşimi olmadan sağlanamadı nedeniyle istek başarısız olursa, belirteç sonucu bir yeniden yönlendirme URL'si içerir. Bu URL'ye giderek kullanıcı, başarılı bir kimlik doğrulamasının ardından oturum açma sayfasına ve geçerli sayfaya geri döner.
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http
...
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}
}
Uygulamayı çalıştırma
Uygulamayı Sunucu projesinden çalıştırın. Visual Studio kullanırken:
- Araç çubuğundaki Başlangıç Projeleri açılan listesini Sunucu API'si uygulamasına ayarlayın ve Çalıştır düğmesini seçin.
- Sunucu projesini seçin Çözüm Gezgini araç çubuğunda Çalıştır düğmesini seçin veya Hata Ayıklama menüsünden uygulamayı çalıştırın.
API yetkilendirmesi ile ad ve rol talebi
Özel kullanıcı fabrikası
Uygulamada Client özel bir kullanıcı fabrikası oluşturun. Identity Sunucu, tek bir talepte JSON dizisi olarak birden çok rol role gönderir. Talepte dize değeri olarak tek bir rol gönderilir. Fabrika, kullanıcının role rollerinin her biri için ayrı bir talep oluşturur.
CustomUserFactory.cs:
using System.Linq;
using System.Security.Claims;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
public class CustomUserFactory
: AccountClaimsPrincipalFactory<RemoteUserAccount>
{
public CustomUserFactory(IAccessTokenProviderAccessor accessor)
: base(accessor)
{
}
public override async ValueTask<ClaimsPrincipal> CreateUserAsync(
RemoteUserAccount account,
RemoteAuthenticationUserOptions options)
{
var user = await base.CreateUserAsync(account, options);
if (user.Identity.IsAuthenticated)
{
var identity = (ClaimsIdentity)user.Identity;
var roleClaims = identity.FindAll(identity.RoleClaimType).ToArray();
if (roleClaims.Any())
{
foreach (var existingClaim in roleClaims)
{
identity.RemoveClaim(existingClaim);
}
var rolesElem = account.AdditionalProperties[identity.RoleClaimType];
if (rolesElem is JsonElement roles)
{
if (roles.ValueKind == JsonValueKind.Array)
{
foreach (var role in roles.EnumerateArray())
{
identity.AddClaim(new Claim(options.RoleClaim, role.GetString()));
}
}
else
{
identity.AddClaim(new Claim(options.RoleClaim, roles.GetString()));
}
}
}
}
return user;
}
}
Uygulamada Client fabrikayı 'a Program.cs kaydettirin:
builder.Services.AddApiAuthorization()
.AddAccountClaimsPrincipalFactory<CustomUserFactory>();
Uygulamada, Server AddRoles rolle ilgili Identity hizmetler ekleyen oluşturucuda çağrısı:
using Microsoft.AspNetCore.Identity;
...
services.AddDefaultIdentity<ApplicationUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Sunucuyu Identity Yapılandırma
Aşağıdaki yaklaşımlardan birini kullanın:
API yetkilendirme seçenekleri
Uygulamada: Server
- IdentitySunucu'ya ve
nametaleplerini kimlikrolebelirteci ve erişim belirteci içine alacak şekilde yapılandırma. - JWT belirteci işleyicisinde roller için varsayılan eşlemeyi engelin.
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
...
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => {
options.IdentityResources["openid"].UserClaims.Add("name");
options.ApiResources.Single().UserClaims.Add("name");
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Profil Hizmeti
Uygulamada Server bir uygulama ProfileService oluşturun.
ProfileService.cs:
using IdentityModel;
using Duende.IdentityServer.Models;
using Duende.IdentityServer.Services;
using System.Threading.Tasks;
public class ProfileService : IProfileService
{
public ProfileService()
{
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var nameClaim = context.Subject.FindAll(JwtClaimTypes.Name);
context.IssuedClaims.AddRange(nameClaim);
var roleClaims = context.Subject.FindAll(JwtClaimTypes.Role);
context.IssuedClaims.AddRange(roleClaims);
await Task.CompletedTask;
}
public async Task IsActiveAsync(IsActiveContext context)
{
await Task.CompletedTask;
}
}
Uygulamada, Server Profil Hizmeti'nin kaydını 'a Program.cs tıklayın:
using Duende.IdentityServer.Services;
...
builder.Services.AddTransient<IProfileService, ProfileService>();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Yetkilendirme mekanizmalarını kullanma
Uygulamada Client bileşen yetkilendirme yaklaşımları bu noktada işlevseldir. Bileşenlerde bulunan yetkilendirme mekanizmalarının herhangi biri, kullanıcıya yetkilendirmek için bir rol kullanabilir:
AuthorizeViewbileşen (Örnek:<AuthorizeView Roles="admin">)[Authorize]attribute yönergesi AuthorizeAttribute ( ) (Örnek:@attribute [Authorize(Roles = "admin")])Yordam mantığı (Örnek:
if (user.IsInRole("admin")) { ... })Birden çok rol testi de destekler:
if (user.IsInRole("admin") && user.IsInRole("developer")) { ... }
User.Identity.Name uygulamada genellikle Client oturum açma e-posta adresi olan kullanıcının kullanıcı adıyla doldurulur.
UserManager ve SignInManager
Bir sunucu uygulaması gerektirdiğinde Kullanıcı tanımlayıcısı talep türünü ayarlayın:
- UserManager<TUser> ya da SignInManager<TUser> BIR API uç noktasında.
- IdentityUser kullanıcının adı, e-posta adresi veya kilitleme bitiş saati gibi ayrıntılar.
Program.csASP.NET Core 6,0 veya üzeri için:
using System.Security.Claims;
...
builder.Services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Startup.ConfigureServices6,0 ' den önceki ASP.NET Core sürümleri için:
using System.Security.Claims;
...
services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Aşağıdaki, WeatherForecastController UserName yöntemi çağrıldığında günlüğe kaydedilir Get :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using {APP NAMESPACE}.Server.Models;
using {APP NAMESPACE}.Shared;
namespace {APP NAMESPACE}.Server.Controllers
{
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly UserManager<ApplicationUser> userManager;
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm",
"Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
UserManager<ApplicationUser> userManager)
{
this.logger = logger;
this.userManager = userManager;
}
[HttpGet]
public async Task<IEnumerable<WeatherForecast>> Get()
{
var rng = new Random();
var user = await userManager.GetUserAsync(User);
if (user != null)
{
logger.LogInformation($"User.Identity.Name: {user.UserName}");
}
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Özel Azure App Service ve sertifika ile konak
Aşağıdaki kılavuzda aşağıdakiler açık açıklamalıdır:
- Sunucu ile barındırılan bir Blazor WebAssembly uygulamayı özel bir etki Identity Azure App Service sunucuya dağıtma.
- Tarayıcılarla HTTPS protokolü iletişimi için TLS sertifikası oluşturma ve kullanma. Kılavuz sertifikayı özel bir etki alanıyla kullanmaya odaklansa da, kılavuz varsayılan Azure Apps etki alanının kullanımına eşit olarak geçerlidir, örneğin
contoso.azurewebsites.net.
Bu barındırma senaryosunda, Sunucunun belirteç Identity imzalama anahtarı ve sitenin tarayıcılarla https güvenli iletişimi için aynı sertifikayı kullanmayın:
- Bu iki gereksinimler için farklı sertifikalar kullanmak iyi bir güvenlik uygulamasıdır çünkü her amaç için özel anahtarları yalıtır.
- Tarayıcılarla iletişim için TLS sertifikaları, Sunucunun belirteç imzalamasını Identity etkilemeden bağımsız olarak yönetilir.
- Sunucu Azure Key Vault özel etki alanı bağlaması için App Service uygulamasına sertifika sağlarken, Sunucu belirteç imzalama için Azure Key Vault Identity sertifikayı alamaz. Sunucuyu fiziksel bir yoldan aynı TLS sertifikasını kullanmak üzere yapılandırmak mümkün olsa da, güvenlik sertifikalarını kaynak denetimine yerleştirmek kötü bir uygulamadır ve çoğu senaryoda Identity kaçınılmalıdır.
Aşağıdaki kılavuzda, yalnızca Sunucu belirteci imzalama için Azure Key Vault bir otomatik olarak Identity imzalanan sertifika oluşturulur. Sunucu Identity yapılandırması, uygulamanın sertifika deposu aracılığıyla anahtar kasası CurrentUser > My sertifikasını kullanır. Özel etki alanlarıyla HTTPS trafiği için kullanılan diğer sertifikalar Sunucu imzalama sertifikasından ayrı olarak Identity oluşturulur ve yapılandırılır.
Bir uygulamayı yapılandırmak için Azure App Service ve Azure Key Vault etki alanı ve HTTPS ile barındırabilirsiniz:
Plan App Service daha yüksek bir plan
Basic B1oluşturun. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.Sitenin güvenli tarayıcı iletişimi (HTTPS protokolü) için, sitenin tam etki alanı adının (FQDN) ortak bir adıyla (örneğin, ) bir PFX sertifikası
www.contoso.comoluşturun. Sertifikayı şu şekilde oluşturun:- Anahtar kullanımları
- Dijital imza doğrulaması (
digitalSignature) - Anahtar şifrelemesi (
keyEncipherment)
- Dijital imza doğrulaması (
- Gelişmiş/genişletilmiş anahtar kullanımları
- İstemci Kimlik Doğrulaması (1.3.6.1.5.5.7.3.2)
- Sunucu Kimlik Doğrulaması (1.3.6.1.5.5.7.3.1)
Sertifikayı oluşturmak için aşağıdaki yaklaşımlardan birini veya diğer uygun araç ya da çevrimiçi hizmetlerden birini kullanın:
Daha sonra sertifikayı sertifikayı sertifikaya içeri aktarmada kullanılan parolayı Azure Key Vault.
Sertifikalar hakkında daha Azure Key Vault için bkz. Azure Key Vault: Sertifikalar.
- Anahtar kullanımları
Azure aboneliğinde Azure Key Vault yeni bir anahtar kasası oluşturun veya var olan bir anahtar kasasını kullanın.
Anahtar kasasının Sertifikalar alanında PFX site sertifikasını içeri aktarın. Daha sonra uygulamanın yapılandırmasında kullanılan sertifikanın parmak izini kaydetme.
Bu Azure Key Vault, Sunucu belirteci imzalama için otomatik olarak imzalanan Identity yeni bir sertifika oluşturma. Sertifikaya bir Sertifika Adı ve Konu girin. Konu olarak
CN={COMMON NAME}belirtilir; burada yer tutucu{COMMON NAME}sertifikanın ortak adıdır. Ortak ad herhangi bir alfasayısal dize olabilir. Örneğin, geçerliCN=IdentityServerSigningbir sertifika Konudur. Varsayılan Gelişmiş İlke Yapılandırması ayarlarını kullanın. Daha sonra uygulamanın yapılandırmasında kullanılan sertifikanın parmak izini kaydetme.Azure App Service'Azure portal gidin ve aşağıdaki yapılandırmayla App Service yeni bir hesap oluşturun:
- Yayımlama olarak
Codeayarlanmış. - Çalışma zamanı yığını, uygulamanın çalışma zamanının çalışma zamanı olarak ayarlanır.
- Sku ve boyut için, depolama katmanının App Service olduğunu
Basic B1onaylayın. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.
- Yayımlama olarak
Azure uygulamayı App Service sonra uygulamanın Yapılandırma'sını açın ve daha önce kaydedilen sertifika parmak izini belirten yeni bir uygulama ayarı ekleyin. Uygulama ayarı anahtarı şu
WEBSITE_LOAD_CERTIFICATESşekildedir: . Aşağıdaki örnekte olduğu gibi, uygulama ayarı değerindeki sertifika parmak izini virgülle ayırabilirsiniz:- Anahtar:
WEBSITE_LOAD_CERTIFICATES - Değer:
57443A552A46DB...D55E28D412B943565,29F43A772CB6AF...1D04F0C67F85FB0B1
Bu Azure portal uygulama ayarlarını kaydetme iki adımlı bir işlemdir: Anahtar-değer ayarını kaydedin ve dikey penceresindeki Kaydet
WEBSITE_LOAD_CERTIFICATESdüğmesini seçin.- Anahtar:
Uygulamanın TLS/SSL ayarlarını seçin. Özel Anahtar Sertifikaları (.pfx) öğesini seçin. Hem sitenin HTTPS Key Vault hem de sitenin otomatik olarak imzalanan Sunucu belirteci imzalama sertifikasını içeri almak için Sertifikayı İçeri Aktar işlemini iki Identity kez kullanın.
Özel etki alanları dikey penceresine gidin. Etki alanı kayıt şirketinizin web sitesinde, etki alanını yapılandırmak için IP adresini Custom Domain kimlik doğrulama kimliğini kullanın. Tipik bir etki alanı yapılandırması şunları içerir:
- Konak ve ip adresi değerine sahip bir A
@Kaydı Azure portal. - Konak ve Azure tarafından oluşturulan ve kimlik doğrulaması tarafından sağlanan doğrulama kimliğinin değerine sahip txt
asuidAzure portal.
Değişiklikleri etki alanı kayıt şirketinizin web sitesinde doğru şekilde kaydetmeyi doğrulayın. Bazı kayıt şirketi web siteleri, etki alanı kayıtlarını kaydetmek için iki adımlı bir işlem gerektirir: Bir veya daha fazla kayıt tek tek kaydedilir ve ardından etki alanının kaydı ayrı bir düğmeyle güncelleştirmeyi içerir.
- Konak ve ip adresi değerine sahip bir A
Uygulamanın Özel etki alanları dikey penceresine Azure portal. Özel etki alanı ekle'yi seçin. A Kaydı seçeneğini belirleyin. Etki alanını s sağlama ve Doğrula'yi seçin. Etki alanı kayıtları doğruysa ve İnternet'e yayıldıysa portal, Özel etki alanı ekle düğmesini seçmenize olanak sağlar.
Etki alanı kayıt şirketiniz tarafından işlendikten sonra etki alanı kayıt değişikliklerinin İnternet etki alanı adı sunucularına (DNS) yayılması birkaç gün sürer. Etki alanı kayıtları üç iş günü içinde güncelleştirilmezse, kayıtların etki alanı kayıt şirketiyle doğru şekilde ayar olduğunu onaylayın ve müşteri desteğine başvurun.
Özel etki alanları dikey penceresinde, etki alanının SSL DURUMU olarak
Not Secureişaretlenir. Bağlama ekle bağlantısını seçin. Özel etki alanı bağlaması için anahtar kasasında site HTTPS sertifikasını seçin.Bu Visual Studio, Sunucu projesinin uygulama ayarları dosyasını ( veya )
appsettings.jsonappsettings.Production.jsonaçın. Sunucu Identity yapılandırması'nın aşağıdaki bölümünüKeyekleyin. Anahtar için otomatik olarak imzalanan sertifika KonusunuNamebelirtin. Aşağıdaki örnekte, sertifikanın anahtar kasasında atanan ortak adı, bir Konu değerineIdentityServerSigningneden olan adıdır:CN=IdentityServerSigning"IdentityServer": { ... "Key": { "Type": "Store", "StoreName": "My", "StoreLocation": "CurrentUser", "Name": "CN=IdentityServerSigning" } },Bu Visual Studio, Sunucu Azure App Service için bir yayımlama profili oluşturun. Menü çubuğundan Şu seçeneği belirleyin: Yeni Azure > Azure App Service > > > (Windows Linux) yayımlayın. Bir Visual Studio Azure aboneliğine bağlı olduğunuzda, Azure kaynaklarının Görünümünü Kaynak türüne göre ayarlayın. Web Uygulaması listesinde gezinerek uygulamanın App Service seçin. Son'u seçin.
Bu Visual Studio yayımla penceresine döndüğünde anahtar kasası ve SQL Server veritabanı hizmeti bağımlılıkları otomatik olarak algılanır.
Anahtar kasası hizmeti için varsayılan ayarlarda yapılandırma değişikliği gerekmez.
Test amacıyla, şablon tarafından varsayılan olarak yapılandırılan bir uygulamanın yerel SQLite veritabanı, ek yapılandırma olmadan Blazor uygulamayla dağıtılabilir. Üretimde Sunucu için farklı Identity bir veritabanı yapılandırmak bu makalenin kapsamının dışındadır. Daha fazla bilgi için aşağıdaki belge kümelerinde veritabanı kaynaklarına bakın:
Pencerenin üst kısmında dağıtım profili adının altında Düzenle bağlantısını seçin. Hedef URL'yi sitenin özel etki alanı URL'si ile (örneğin, )
https://www.contoso.comdeğiştirme. Ayarları kaydedin.Uygulamayı yayımlayın. Visual Studio bir tarayıcı penceresi açar ve sitenin özel etki alanında istekte bulunanlar.
Azure belgeleri, A kayıtları yerine CNAME kayıtlarını kullanma hakkında bilgiler de dahil olmak üzere azure hizmetlerinde ve App Service'da TLS bağlaması ile özel etki alanlarının kullanımıyla ilgili ek ayrıntılar içerir. Daha fazla bilgi için aşağıdaki kaynaklara bakın:
- App Service belgeleri
- Öğretici: Mevcut özel DNS adını Azure App Service'e eşleme
- TlS/SSL bağlaması ile özel bir DNS adının güvenliğini Azure App Service
- Azure Key Vault
Uygulama, uygulama yapılandırması veya uygulama yapılandırmasında yapılan bir değişiklik sonrasında her uygulama test çalıştırması için yeni bir özel veya gizli tarayıcı penceresi Azure portal. Önceki bir test çalıştırmasına bağlı kalanlar, site yapılandırması doğru olsa bile siteyi test etmek için başarısız kimlik doğrulaması cookie veya yetkilendirmeye neden olabilir. Her test çalıştırması için Visual Studio özel veya gizli tarayıcı penceresi açmak üzere yapılandırma hakkında daha fazla bilgi için Cookie s ve site verileri bölümüne bakın.
Uygulama App Service yapılandırma değiştir Azure portal güncelleştirmeler genellikle hızlı bir şekilde etkili olur ancak anlık olmaz. Bazen yapılandırma değişikliğinin etkili olması için App Service için kısa bir süre beklemeniz gerekir.
Sertifika yükleme sorununu giderirse, kudu PowerShell komut kabuğunda Azure portal komutunu yürütün. Komut, uygulamanın sertifika depolamadan erişenin sertifika listesini CurrentUser > My sağlar. Çıktı, bir uygulamada hata ayıklarken yararlı olan sertifika konularını ve parmak izini içerir:
Get-ChildItem -path Cert:\CurrentUser\My -Recurse | Format-List DnsNameList, Subject, Thumbprint, EnhancedKeyUsageList
Sorun giderme
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ırma nedeniyle oluşur. Aşağıda birkaç örnek verilmiştir:
- Senaryonun gereksinimlerine bağlı olarak, eksik veya yanlış bir yetkili, örnek, kiracı KIMLIĞI, kiracı etki alanı, Istemci KIMLIĞI veya yeniden yönlendirme URI 'SI, bir uygulamanın istemcilerin kimliğini doğrulamasını önler.
- Yanlış bir erişim belirteci kapsamı, istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Yanlış veya eksik sunucu API izinleri istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Uygulamayı, sağlayıcının uygulama kaydının yeniden yönlendirme URI 'sinde yapılandırılmış olandan farklı bir bağlantı noktasında çalıştırmak Identity .
Bu makalenin kılavuzunun yapılandırma bölümlerinde doğru yapılandırma örnekleri gösterilmektedir. Uygulama ve IP yanlış yapılandırmayla ilgili makalenin her bölümüne dikkatle göz atın.
Yapılandırma doğru görünüyorsa:
Uygulama günlüklerini analiz edin.
Tarayıcı geliştirici araçlarıyla istemci uygulaması ile IP veya sunucu uygulaması arasındaki ağ trafiğini inceleyin. Genellikle, bir istek yapıldıktan sonra, hataya neden olan bir hata iletisi veya bir sorun olduğunu bir ileti, 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)
Bir istemcinin kimliğini doğrulamak için kullanılan bir JSON Web Token (JWT) içeriğinin kodunu çözün veya sorunun nerede oluştuğunu bağlı olarak bir sunucu Web API 'sine erişim. Daha fazla bilgi için bkz. bir JSON Web token (JWT) Içeriğini İnceleme.
Belgeler, makalelerdeki belge geri bildirimlerine ve hatalara yanıt veriyor ( Bu sayfa geri bildirimi bölümünden bir sorun açar), ancak ürün desteği sağlayamadı. Bir uygulamanın sorunlarını gidermeye yardımcı olmak için çeşitli genel destek forumları vardır. Şunları öneririz:
Önceki Forumlar Microsoft tarafından sahip değil veya denetlenmiyor.
güvenlikle ilgili olmayan, hassas olmayan ve gizli olmayan bir dizi framework hata raporu için ASP.NET Core ürün birimiyle bir sorun açın. Bir sorunun nedenini iyice araştırmadan ve bir genel destek forumundaki topluluk yardımıyla, ürün birimiyle ilgili bir sorun açmayın. Ürün birimi, basit yanlış yapılandırma veya üçüncü taraf hizmetleri içeren durumlar nedeniyle bozuk olan ayrı uygulamalarla ilgili sorunları gideremez. bir rapor hassas veya gizli ise ve saldırganların yararlanabilecek potansiyel bir güvenlik kusurunu kullanıyorsa, bkz. raporlama güvenlik sorunları ve hataları (dotnet/aspnetcore GitHub repository).
AAD için yetkisiz istemci
bilgi: Microsoft. AspNetCore. Authorization. DefaultAuthorizationService [2] yetkilendirmesi başarısız oldu. Bu gereksinimler karşılanmadı: DenyAnonymousAuthorizationRequirement: kimliği doğrulanmış bir kullanıcı gerektirir.
AAD oturum açma geri çağırma hatası:
- Hata:
unauthorized_client - Açıklaması
AADB2C90058: The provided application is not configured to allow public clients.
Hatayı gidermek için:
- Azure portal, uygulamanın bildirimineerişin.
-
allowPublicClientÖzniteliğini veya olarak ayarlayınnulltrue.
- Hata:
Cookies ve site verileri
Cookies ve site verileri, uygulama güncelleştirmelerinde devam edebilir ve test ve sorun giderme işlemlerini etkileyebilir. Uygulama kodu değişiklikleri yaparken, sağlayıcı ile Kullanıcı hesabı değişiklikleri veya sağlayıcı uygulama yapılandırma değişiklikleri yaparken aşağıdakileri temizleyin:
- Kullanıcı oturum açma cookie öğeleri
- Uygulama cookie s
- Önbelleğe alınmış ve depolanan site verileri
Kalan cookie s ve site verilerinin test ve sorun giderme konusunda kesintiye uğramasını önleyen bir yaklaşım:
- Tarayıcı yapılandırma
- cookieTarayıcı her kapatıldığında tüm ve site verilerini silmek üzere yapılandırabileceğiniz test için bir tarayıcı kullanın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasının herhangi bir değişikliği için tarayıcının el ile veya IDE tarafından kapatıldığından emin olun.
- Visual Studio ' deki bir tarayıcıyı veya özel modda açmak için özel bir komut kullanın:
- Visual Studio çalıştır düğmesinden , 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 konuma yüklenirse veya Windows 10 kullanmıyorsanız, tarayıcının yürütülebilir dosyasının yolunu belirtin.
- 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 ınbilito veya Private modunda 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: Use
--incognito --new-window {URL}, yer tutucunun{URL}açılacağı URL (örneğin,https://localhost:5001). - Mozilla Firefox: Use
-private -url {URL}, yer tutucunun{URL}açılacağı URL (ö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.
- Her bir uygulamayla test yinelemesi için tarayıcı profilini seçmek zorunda kalmamak için, profili varsayılan olarak Ayarla düğmesi ile varsayılan olarak ayarlayın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasındaki herhangi bir değişiklik için, tarayıcının IDE tarafından kapatıldığından emin olun.
Uygulama yükseltmeleri
Çalışan bir uygulama, geliştirme makinesindeki .NET Core SDK yükseltmeden veya uygulama içindeki paket sürümlerini değiştirirken hemen başarısız olabilir. Bazı durumlarda, önemli paketler ana yükseltmeler gerçekleştirirken bir uygulamayı bozabilir. Bu sorunların çoğu aşağıdaki yönergeleri izleyerek düzeltilebilir:
- bir komut kabuğundan yürüterek yerel sistemin NuGet paketi önbelleklerini temizleyin
dotnet nuget locals all --clear. - Proje
binveobjklasörlerini silin. - Projeyi geri yükleyin ve yeniden derleyin.
- Uygulamayı yeniden dağıtmadan önce sunucusundaki dağıtım klasöründeki tüm dosyaları silin.
Not
Uygulamanın hedef çerçevesiyle uyumsuz paket sürümlerinin kullanımı desteklenmez. bir paket hakkında daha fazla bilgi için NuGet galerisi veya fuget paket gezgininikullanın.
Sunucu uygulamasını çalıştırma
Barındırılan bir çözümü test etmek ve sorunlarını giderirken Blazor , uygulamayı projeden çalıştırdığınızdan emin olun Server . örneğin Visual Studio ' de, aşağıdaki yaklaşımlardan biriyle uygulamaya başlamadan önce sunucu projesinin Çözüm Gezgini vurgulandığını doğrulayın:
- Çalıştır düğmesini seçin.
- Menüden hata > ayıklamayı Başlat komutunu kullanın.
- F5tuşuna basın.
JSON Web Token (JWT) içeriğini İnceleme
Bir JSON Web Token (JWT) kodunu çözmek için Microsoft 'un JWT.MS aracını kullanın. Kullanıcı arabirimindeki değerler hiçbir şekilde tarayıcınızdan bırakmayın.
Örnek kodlanmış JWT (görüntülenmek üzere kısaltıldı):
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j ... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q
Azure AAD B2C 'da kimlik doğrulayan bir uygulama için araç tarafından kodu çözülen örnek JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
"exp": 1610059429,
"nbf": 1610055829,
"ver": "1.0",
"iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
"sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
"aud": "70bde375-fce3-4b82-984a-b247d823a03f",
"nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
"iat": 1610055829,
"auth_time": 1610055822,
"idp": "idp.com",
"tfp": "B2C_1_signupsignin"
}.[Signature]
Ek kaynaklar
- Azure App Service'a dağıtım
- Sertifikayı Key Vault (Azure belgeleri)
- Blazor WebAssemblyASP.NET Core ek güvenlik senaryoları
- Güvenli varsayılan istemciye sahip bir uygulamada kimliği doğrulanmamış veya yetkisiz web API'si istekleri
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma: Aşağıdakiler hakkında rehberlik içerir:
- Proxy sunucuları ve iç ağlar arasında HTTPS şeması bilgilerini korumak için Iletili Üst Bilgiler Ara Yazılımı'nın kullanımı.
- El ile şema yapılandırması, doğru istek yönlendirmesi için istek yolu değişiklikleri ve Linux ve IIS olmayan ters sunuculara istek şemasını iletme gibi ek senaryolar ve kullanım örnekleri.
- Duende Identity Sunucusu
Bu makalede, kullanıcıların ve API çağrılarının kimliğini Blazor WebAssembly doğrulamak için Sunucu kullanan Identity barındırılan bir çözümün nasıl oluşturularak ilgili açıklanmıştır.
Not
Tek başına veya barındırılan bir uygulamayı var olan bir dış Sunucu örneğini kullanmak Blazor WebAssembly Identity üzere yapılandırmak için, 'de yönergeleri Kimlik doğrulama ASP.NET Core Blazor WebAssembly tek başına bir uygulamanın güvenliğini sağlama izleyin.
Kimlik doğrulama mekanizmasıyla Blazor WebAssembly yeni bir proje oluşturmak için:
Yeni bir proje oluşturma.
Uygulama Blazor WebAssembly şablonunu seçin. İleri’yi seçin.
Tire Project bir ad girin (aşağıdaki UYARI'ya bakın). Konum'ın doğru olduğunu onaylayın. İleri’yi seçin.
Uyarı
Proje adı içinde
-OIDC uygulama tanımlayıcısının oluşmasını bozan tireler ( ) kullanmaktan kaçının. Proje Blazor WebAssembly şablonunda mantık, çözümün yapılandırmasında bir OIDC uygulama tanımlayıcısı için proje adını kullanır. Pascal büyük/küçükBlazorSampleharf ( ) veya alt çizgi ( ) kabul edilebilirBlazor_Samplealternatiflerdir. Daha fazla bilgi için bkz. Barındırılan proje adı kesme Blazor WebAssembly OIDC güvenliğinde tireler (dotnet/aspnetcore #35337).Ek bilgiler iletişim kutusunda Kimlik Doğrulama Türü olarak Bireysel Hesaplar'ı seçerek kullanıcıları uygulamanın içinde, ASP.NET Core sistemiyle Identity depolar.
Barındırılan ASP.NET Core onay kutusunu seçin.
Server uygulama yapılandırması
Aşağıdaki bölümlerde, kimlik doğrulama desteği dahil edilirken projeye yapılan eklemeler açıklanmaktadır.
Başlangıç sınıfı
sınıfı Startup aşağıdaki eklemelere sahip.
Startup.ConfigureServicesiçinde:ASP.NET Core Identity:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();IdentitySunucu'ya AddApiAuthorization ek bir yardımcı yönteme sahip sunucu, ASP.NET Core kuralları Identity ayarlar:
services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();Sunucu tarafından üretilen JWT belirteçlerini doğrulamak için uygulamayı yapılandıran ek bir yardımcı AddIdentityServerJwt yöntem ile kimlik Identity doğrulaması:
services.AddAuthentication() .AddIdentityServerJwt();
Startup.Configureiçinde:Sunucu Identity ara yazılımı OpenID uç Bağlan (OIDC) uç noktalarını gösterir:
app.UseIdentityServer();Kimlik doğrulama ara yazılımı, istek kimlik bilgilerini doğrulamadan ve kullanıcının istek bağlamında ayarlandıktan sorumludur:
app.UseAuthentication();Yetkilendirme Ara Yazılımı yetkilendirme özelliklerini sağlar:
app.UseAuthorization();
Linux üzerinde Azure App Service
Linux üzerinde Azure App Service'a dağıtırken, onu Linux üzerinde Azure App Service. Daha fazla bilgi için bkz. ASP.NET Core'de Tek Sayfalı Uygulamalar için kimlik doğrulamasına giriş.
AddApiAuthorization
Yardımcı AddApiAuthorization yöntemi, Identity Sunucu'ASP.NET Core yapılandırıyor. IdentitySunucu, uygulama güvenliğiyle ilgili sorunları ele alan güçlü ve genişletilebilir bir çerçevedir. IdentitySunucu, en yaygın senaryolar için gereksiz karmaşıklık sunar. Sonuç olarak, iyi bir başlangıç noktası düşüntiğimiz bir dizi kural ve yapılandırma seçeneği sağlanır. Kimlik doğrulama gereksinimleriniz değiştikçe, sunucunun tam gücü, Identity kimlik doğrulamasını uygulamanın gereksinimlerine uyacak şekilde özelleştirmek için kullanılabilir.
IdentityServerjwt Ekle
AddIdentityServerJwtYardımcı yöntemi, varsayılan kimlik doğrulama işleyicisi olarak uygulama için bir ilke düzeni yapılandırır. İlke, Identity URL alanındaki herhangi bir alt yolda yönlendirilen tüm istekleri işlemeye izin verecek şekilde yapılandırılmıştır Identity /Identity . JwtBearerHandlerDiğer tüm istekleri işler. Ayrıca, bu yöntem:
- Bir
{APPLICATION NAME}APIAPI kaynağını sunucu ile Identity varsayılan kapsamına kaydeder{APPLICATION NAME}API. - Uygulama için sunucu tarafından verilen belirteçleri doğrulamak üzere JWT taşıyıcı belirteç ara yazılımını yapılandırır Identity .
Dalgalı bir denetleyici
WeatherForecastController() İçinde Controllers/WeatherForecastController.cs , [Authorize] özniteliği sınıfına uygulanır. Özniteliği, kullanıcıya kaynağa erişim için varsayılan ilkeye göre yetkilendirilmiş olması gerektiğini belirtir. Varsayılan yetkilendirme ilkesi, tarafından ayarlanan varsayılan kimlik doğrulama düzenini kullanacak şekilde yapılandırılır AddIdentityServerJwt . Yardımcı yöntemi, JwtBearerHandler uygulamaya yönelik istekler için varsayılan işleyici olarak yapılandırır.
ApplicationDbContext
ApplicationDbContext() İçinde Data/ApplicationDbContext.cs , DbContext ApiAuthorizationDbContext<TUser> sunucu için şemayı içerecek şekilde genişletilir Identity . ApiAuthorizationDbContext<TUser> , öğesinden türetilir IdentityDbContext .
Veritabanı şemasının tam denetimini elde etmek için, kullanılabilir Identity DbContext sınıflardan birini ve Identity yöntemi metodunu çağırarak şemayı içerecek şekilde yapılandırın builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value) OnModelCreating .
Oıdcconfigurationcontroller
OidcConfigurationController() İçinde Controllers/OidcConfigurationController.cs , istemci uç noktası OIDC parametrelerine hizmeti sunacak şekilde sağlanır.
Uygulama ayarları
Proje kökündeki uygulama ayarları dosyasında ( appsettings.json ), IdentityServer bölümünde yapılandırılan istemcilerin listesi açıklanmaktadır. Aşağıdaki örnekte, tek bir istemci vardır. İstemci adı, uygulama adına karşılık gelir ve kural tarafından OAuth ClientId parametresine eşlenir. Profil, yapılandırılan uygulama türünü gösterir. Profil, sunucu için yapılandırma işlemini basitleştiren kuralları yönlendirmek için dahili olarak kullanılır.
"IdentityServer": {
"Clients": {
"{APP ASSEMBLY}.Client": {
"Profile": "IdentityServerSPA"
}
}
}
Yer tutucu, {APP ASSEMBLY} uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Client Uygulama yapılandırması
Kimlik doğrulama paketi
Bireysel kullanıcı hesapları () kullanmak üzere bir uygulama oluşturulduğunda Individual , uygulama otomatik olarak Microsoft.AspNetCore.Components.WebAssembly.Authentication uygulamanın proje dosyasındaki paket için bir paket başvurusu alır. Paket, uygulamanın kullanıcıların kimliğini doğrulamasına ve korunan API 'Leri çağırmak için belirteçleri almasına yardımcı olan bir dizi temel sunar.
Bir uygulamaya kimlik doğrulaması ekliyorsanız, paketi uygulamanın proje dosyasına el ile ekleyin:
<PackageReference
Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication"
Version="{VERSION}" />
yer tutucu için {VERSION} , paketin, uygulamanın paylaşılan framework sürümüyle eşleşen en son kararlı sürümü, NuGet. orgkonumundaki paketin sürüm geçmişinde bulunabilir.
HttpClient yapılandırmada
' De Program.cs , bir adlandırılmış HttpClient (), {APP ASSEMBLY}.ServerAPI HttpClient sunucu API 'sine istek yaparken erişim belirteçlerini içeren örnekler sağlamak üzere yapılandırılır:
builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI",
client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("{APP ASSEMBLY}.ServerAPI"));
Yer tutucu, {APP ASSEMBLY} uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Not
Bir Blazor WebAssembly uygulamayı barındırılan bir çözümün parçası olmayan var olan bir Identity sunucu örneğini kullanacak şekilde yapılandırıyorsanız Blazor , HttpClient temel adres kaydını IWebAssemblyHostEnvironment.BaseAddress ( builder.HostEnvironment.BaseAddress ) konumundan sunucu uygulamasının API yetkilendirme uç noktası URL 'sine değiştirin.
API yetkilendirme desteği
Kullanıcıları kimlik doğrulama desteği, paket içinde sunulan genişletme yöntemi tarafından hizmet kapsayıcısına takılır Microsoft.AspNetCore.Components.WebAssembly.Authentication . Bu yöntem, uygulamanın mevcut yetkilendirme sistemiyle etkileşimde bulunmak için gereken hizmetleri ayarlar.
builder.Services.AddApiAuthorization();
Varsayılan olarak, uygulamanın yapılandırması tarafından kural tarafından yüklenir _configuration/{client-id} . Kural gereği, istemci KIMLIĞI uygulamanın derleme adına ayarlanır. Bu URL, aþýrý yükleme seçeneklerini çağırarak ayrı bir uç noktaya işaret etmek üzere değiştirilebilir.
Dosya içeri aktarmalar
Microsoft.AspNetCore.Components.AuthorizationAd alanı, uygulama boyunca dosya aracılığıyla kullanılabilir hale getirilir _Imports.razor :
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared
Dizin sayfası
Dizin sayfası ( wwwroot/index.html ) sayfası JavaScript içinde tanımlayan bir komut dosyası içerir AuthenticationService . AuthenticationService OıDC protokolünün alt düzey ayrıntılarını işler. Uygulama, kimlik doğrulama işlemlerini gerçekleştirmek için komut dosyasında tanımlanan yöntemleri dahili olarak çağırır.
<script src="_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/
AuthenticationService.js"></script>
Uygulama bileşeni
Bileşeni App ( ) uygulamalarda bulunan App.razor App bileşene Blazor Server benzer:
- Bileşeni, CascadingAuthenticationState uygulamanın geri AuthenticationState kalanına ifşayı yönetir.
- Bileşen, AuthorizeRouteView geçerli kullanıcının belirli bir sayfaya erişme yetkisine sahip olduğundan veya başka bir şekilde bileşeni işlemeye yetkili olduğundan emin
RedirectToLoginolur. - Bileşen,
RedirectToLoginyetkisiz kullanıcıları oturum açma sayfasına yeniden yönlendirmeyi yönetir.
ASP.NET Core'nin yayınlarında çerçevede yapılan değişikliklerden dolayı, bu bölümde Razor App bileşenin ( App.razor ) işaretlemesi gösterilmez. Bileşenin verilen bir sürüme yönelik işaretlemelerini incelemek için aşağıdaki yaklaşımlardan birini kullanın:
Kullanmak istediğiniz uygulamanın sürümü için varsayılan proje şablonundan kimlik Blazor WebAssembly doğrulaması için ASP.NET Core bir uygulama oluşturun. Oluşturulan
Appuygulamada bileşeniApp.razor( ) inceleme.Başvuru
AppkaynağındaApp.razorbileşeni ( ) inceleme.Not
Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal
mainASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Corerelease/5.05.0 sürümü için dalı seçin.
RedirectToLogin bileşeni
RedirectToLoginBileşen ( Shared/RedirectToLogin.razor ):
- Yetkisiz kullanıcıların oturum açma sayfasına yeniden yönlendirildiğini yönetir.
- Kimlik doğrulaması başarılı olursa bu sayfaya döndürülmeleri için kullanıcının erişmeye çalışan geçerli URL 'YI korur.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo(
$"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
}
}
LoginDisplay bileşeni
LoginDisplayBileşen ( Shared/LoginDisplay.razor ) MainLayout bileşende () içinde işlenir Shared/MainLayout.razor ve aşağıdaki davranışları yönetir:
- Kimliği doğrulanmış kullanıcılar için:
- Geçerli Kullanıcı adını görüntüler.
- İçindeki kullanıcı profili sayfasına bir bağlantı sunar ASP.NET Core Identity .
- Uygulamanın oturumunu kapatmak için bir düğme sunar.
- Anonim kullanıcılar için:
- Kayıt için seçeneği sunar.
- Oturum açma seçeneği sunar.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager
<AuthorizeView>
<Authorized>
<a href="authentication/profile">Hello, @context.User.Identity.Name!</a>
<button class="nav-link btn btn-link" @onclick="BeginSignOut">
Log out
</button>
</Authorized>
<NotAuthorized>
<a href="authentication/register">Register</a>
<a href="authentication/login">Log in</a>
</NotAuthorized>
</AuthorizeView>
@code {
private async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
}
Kimlik doğrulama bileşeni
Bileşeni ( ) tarafından Authentication üretilen Pages/Authentication.razor sayfa, farklı kimlik doğrulama aşamalarını işleme için gereken yolları tanımlar.
RemoteAuthenticatorViewBileşen:
- Paketi tarafından
Microsoft.AspNetCore.Components.WebAssembly.Authenticationsağlanır. - Kimlik doğrulamasının her aşamasında uygun eylemleri gerçekleştirmeyi yönetir.
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
<RemoteAuthenticatorView Action="@Action" />
@code {
[Parameter]
public string Action { get; set; }
}
FetchData bileşeni
Bileşen FetchData şunların nasıl olduğunu gösterir:
- Erişim belirteci sağlama.
- Sunucu uygulamasında korumalı bir kaynak API'sini aramak için erişim belirteci kullanın.
@attribute [Authorize]yönergesi, yetkilendirme sistemine kullanıcının bu bileşeni ziyaret etmek için Blazor WebAssembly yetkilendirilmiş olması gerektiğini gösterir. Uygulamada özniteliğinin Client olması, sunucu üzerinde API'nin düzgün kimlik bilgileri olmadan çağrılması engellemez. Uygulamanın Server bunları doğru şekilde korumak için uygun uç noktaları da [Authorize] kullanması gerekir.
IAccessTokenProvider.RequestAccessToken , API'yi çağırma isteğine eklen bir erişim belirteci isteğiyle ilgilenmeyi sağlar. Belirteç önbelleğe alınmışsa veya hizmet kullanıcı etkileşimi olmadan yeni bir erişim belirteci sağlandı ise, belirteç isteği başarılı olur. Aksi takdirde, belirteç isteği deyiminde AccessTokenNotAvailableException yakalanan ile başarısız try-catch olur.
İstekte yer alan gerçek belirteci elde etmek için, uygulamanın çağırarak isteğin başarılı olup olduğunu denetlemesi tokenResult.TryGetToken(out var token) gerekir.
İstek başarılı olursa, belirteç değişkeni erişim belirteci ile doldurulur. AccessToken.ValueBelirteci özelliği, istek üst bilgisinde yer alan değişmez Authorization dizeyi gösterir.
belirteç kullanıcı etkileşimi olmadan sağlanamadı nedeniyle istek başarısız olursa, belirteç sonucu bir yeniden yönlendirme URL'si içerir. Bu URL'ye giderek kullanıcı, başarılı bir kimlik doğrulamasının ardından oturum açma sayfasına ve geçerli sayfaya geri döner.
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http
...
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}
}
Uygulamayı çalıştırma
Uygulamayı sunucu projesinden çalıştırın. Visual Studio kullanırken şunlardan birini yapın:
- Araç çubuğundaki başlangıç projeleri açılan listesini sunucu API 'si uygulamasına ayarlayın ve Çalıştır düğmesini seçin.
- Çözüm Gezgini ' de sunucu projesini seçin ve araç çubuğundaki Çalıştır düğmesini seçin veya uygulamayı Hata Ayıkla menüsünden başlatın.
API yetkilendirmesi ile ad ve rol talebi
Özel Kullanıcı fabrikası
Client Uygulamada, özel bir Kullanıcı fabrikası oluşturun. Identity Sunucu, tek bir talep içinde birden çok rolü JSON dizisi olarak gönderir role . Tek bir rol, talepte bir dize değeri olarak gönderilir. Fabrika, role kullanıcının rollerinin her biri için ayrı bir talep oluşturur.
CustomUserFactory.cs:
using System.Linq;
using System.Security.Claims;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
public class CustomUserFactory
: AccountClaimsPrincipalFactory<RemoteUserAccount>
{
public CustomUserFactory(IAccessTokenProviderAccessor accessor)
: base(accessor)
{
}
public override async ValueTask<ClaimsPrincipal> CreateUserAsync(
RemoteUserAccount account,
RemoteAuthenticationUserOptions options)
{
var user = await base.CreateUserAsync(account, options);
if (user.Identity.IsAuthenticated)
{
var identity = (ClaimsIdentity)user.Identity;
var roleClaims = identity.FindAll(identity.RoleClaimType).ToArray();
if (roleClaims.Any())
{
foreach (var existingClaim in roleClaims)
{
identity.RemoveClaim(existingClaim);
}
var rolesElem = account.AdditionalProperties[identity.RoleClaimType];
if (rolesElem is JsonElement roles)
{
if (roles.ValueKind == JsonValueKind.Array)
{
foreach (var role in roles.EnumerateArray())
{
identity.AddClaim(new Claim(options.RoleClaim, role.GetString()));
}
}
else
{
identity.AddClaim(new Claim(options.RoleClaim, roles.GetString()));
}
}
}
}
return user;
}
}
Client Uygulamada, fabrikada kaydolun Program.cs :
builder.Services.AddApiAuthorization()
.AddAccountClaimsPrincipalFactory<CustomUserFactory>();
Uygulamada, Server AddRoles Identity rol ile ilgili hizmetleri ekleyen Oluşturucu üzerinde çağırın:
using Microsoft.AspNetCore.Identity;
...
services.AddDefaultIdentity<ApplicationUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
IdentitySunucu yapılandırma
Aşağıdaki yaklaşımlardan birini kullanın:
API yetkilendirme seçenekleri
Server Uygulamada:
- Identity
nameVeroletaleplerini kimlik belirtecine ve erişim belirtecine yerleştirmek için sunucuyu yapılandırın. - JWT belirteci işleyicisindeki roller için varsayılan eşlemeyi engelleyin.
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
...
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => {
options.IdentityResources["openid"].UserClaims.Add("name");
options.ApiResources.Single().UserClaims.Add("name");
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Profil hizmeti
Server Uygulamada bir ProfileService uygulama oluşturun.
ProfileService.cs:
using IdentityModel;
using IdentityServer4.Models;
using IdentityServer4.Services;
using System.Threading.Tasks;
public class ProfileService : IProfileService
{
public ProfileService()
{
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var nameClaim = context.Subject.FindAll(JwtClaimTypes.Name);
context.IssuedClaims.AddRange(nameClaim);
var roleClaims = context.Subject.FindAll(JwtClaimTypes.Role);
context.IssuedClaims.AddRange(roleClaims);
await Task.CompletedTask;
}
public async Task IsActiveAsync(IsActiveContext context)
{
await Task.CompletedTask;
}
}
Server Uygulamada, profil hizmetini şu şekilde kaydedin Startup.ConfigureServices :
using IdentityServer4.Services;
...
services.AddTransient<IProfileService, ProfileService>();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Yetkilendirme mekanizmalarını kullanma
Client Uygulamada, bileşen yetkilendirme yaklaşımları bu noktada işlevseldir. Bileşenlerdeki yetkilendirme mekanizmalarının herhangi biri, kullanıcıyı yetkilendirmek için bir rol kullanabilir:
AuthorizeViewbileşen (örnek:<AuthorizeView Roles="admin">)[Authorize]Attribute yönergesi ( AuthorizeAttribute ) (örnek:@attribute [Authorize(Roles = "admin")])Yordamsal Logic (örnek:
if (user.IsInRole("admin")) { ... })Birden çok rol testi desteklenir:
if (user.IsInRole("admin") && user.IsInRole("developer")) { ... }
User.Identity.Name , Client genellikle oturum açma e-posta adresi olan kullanıcının kullanıcı adıyla birlikte doldurulur.
UserManager ve SignInManager
Bir sunucu uygulaması gerektirdiğinde Kullanıcı tanımlayıcısı talep türünü ayarlayın:
- UserManager<TUser> ya da SignInManager<TUser> BIR API uç noktasında.
- IdentityUser kullanıcının adı, e-posta adresi veya kilitleme bitiş saati gibi ayrıntılar.
Program.csASP.NET Core 6,0 veya üzeri için:
using System.Security.Claims;
...
builder.Services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Startup.ConfigureServices6,0 ' den önceki ASP.NET Core sürümleri için:
using System.Security.Claims;
...
services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Aşağıdaki, WeatherForecastController UserName yöntemi çağrıldığında günlüğe kaydedilir Get :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using {APP NAMESPACE}.Server.Models;
using {APP NAMESPACE}.Shared;
namespace {APP NAMESPACE}.Server.Controllers
{
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly UserManager<ApplicationUser> userManager;
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm",
"Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
UserManager<ApplicationUser> userManager)
{
this.logger = logger;
this.userManager = userManager;
}
[HttpGet]
public async Task<IEnumerable<WeatherForecast>> Get()
{
var rng = new Random();
var user = await userManager.GetUserAsync(User);
if (user != null)
{
logger.LogInformation($"User.Identity.Name: {user.UserName}");
}
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Azure App Service ile belirteç imzalama senaryoları
İki senaryo ele alınmıştır. Aşağıdaki bölümlerden birindeki yönergeleri izleyin:
- Azure Key Vault kullanarak otomatik belirteç imzalama ve veri koruma anahtarı güvenliği ile Azure App Service barındırın
- Sertifika belirteci imzalama ile Azure App Service barındırın
Azure Key Vault kullanarak otomatik belirteç imzalama ve veri koruma anahtarı güvenliği ile Azure App Service barındırın
Bu bölümdeki kılavuz şunları açıklamaktadır:
- Blazor WebAssembly Identity Azure App Serviceiçin sunucu ile barındırılan bir uygulama dağıtma.
- IdentityAzure Key Vault tarafından güvenliği sağlanmış veri koruma anahtarlarıyla otomatik sunucu belirteci imzalamayı kullanma.
Not
Bu bölümdeki kılavuzdan sonra HTTPS protokol iletişimine yönelik bir TLS sertifikası oluşturup dağıtmak için, bu makalenin Azure App Service bölümünde HTTPS protokol iletişimi için özel etki alanı ve TLS sertifikası kullanma bölümüne bakın.
App Service planıoluşturun.
Not
Basic B1Aynı zamanda uygulamayla bir veya daha fazla özel etki alanı kullanmayı planlıyorsanız, plan düzeyi veya daha yüksek katman içeren App Service bir plan gereklidir.Yeni bir Azure Key Vault oluşturun veya Azure aboneliğinizde mevcut bir anahtar kasasını kullanın.
Azure portal Azure App Service gidin ve aşağıdaki yapılandırmayla yeni bir App Service oluşturun:
- Kümeyi olarak Yayımla
Code. - Çalışma zamanı yığını , uygulamanın çalışma zamanına ayarlandı.
- SKU ve boyut için,
Basic B1özel bir etki alanı kullanmayı planlıyorsanız App Service katmanının veya daha yüksek olduğunu doğrulayın. App Service, birBasic B1veya daha yüksek hizmet katmanının özel etki alanlarını kullanmasını gerektirir.
- Kümeyi olarak Yayımla
uygulamayı, ASP.NET Core veri koruma anahtarlarını depolamak ve korumak için otomatik belirteç imzalama ve Azure Key Vault kullanacak şekilde yapılandırın:
Identity Sunucu belirteci imzalama varsayılan olarak otomatiktir. Identitysunucu ayrıca varsayılan olarak ASP.NET Core veri koruma kullanır. Bu özellikler için uygulamada herhangi bir yapılandırma gerekmez. Daha fazla bilgi için bkz. otomatik anahtar yönetimi (Duende yazılım belgeleri).
uygulama, ASP.NET Core veri koruma için kullanılan anahtarları depolamak ve korumak üzere Azure Key Vault kullanmak için yapılandırma gerektirir. gerekli özellikleri yapılandırmak için aşağıdaki ASP.NET Core belge kaynakları içindeki kılavuzu kullanın:
Visual Studio, sunucu projesi için bir Azure App Service yayımlama profili oluşturun. menü çubuğundan: derleme > > yeni > Azure > Azure App Service yayımlama (Windows veya Linux) seçeneğini belirleyin. Visual Studio bir azure aboneliğine bağlandığında, azure kaynaklarının görünümünü kaynak türüne göre ayarlayabilirsiniz. Uygulamanın App Service bulmak ve bunu seçmek için Web uygulaması listesinde gezinin. Son'u seçin.
Visual Studio yayımla penceresine döndüğünde, anahtar kasası ve SQL Server veritabanı hizmeti bağımlılıkları otomatik olarak algılanır.
Anahtar Kasası hizmeti için varsayılan ayarlarda yapılandırma değişikliği yapılması gerekmez.
Test amacıyla, bir uygulamanın varsayılan olarak şablon tarafından yapılandırılan yerel SQLite veritabanı, Blazor ek yapılandırma olmadan uygulamayla birlikte dağıtılabilir. Üretimde sunucu için farklı bir veritabanını yapılandırmak, Identity Bu makalenin kapsamı dışındadır. Daha fazla bilgi için aşağıdaki belge kümelerinde veritabanı kaynaklarına bakın:
Uygulamayı yayımlayın. Visual Studio bir tarayıcı penceresi açar ve siteyi ister.
Azure belgeleri, Azure hizmetlerini kullanmayla ilgili ek bilgiler içerir. Aşağıdaki kaynaklara bakın:
Uygulama, uygulama yapılandırması veya Azure portal Azure hizmetlerinde yapılan bir değişiklikten sonra her uygulama test çalışması için yeni bir özel veya geçersiz tarayıcı penceresi kullanmanızı öneririz. cookieÖnceki bir test çalıştırağından kalan öğeleri, site yapılandırması doğru olsa bile siteyi test ederken başarısız kimlik doğrulama veya yetkilendirmeyle sonuçlanabilir. Visual Studio yapılandırma hakkında daha fazla bilgi için, her test çalıştırmasında yeni bir özel veya bir tarayıcı penceresi açmak üzere, Cookie s ve site verileri bölümüne bakın.
Azure portal App Service yapılandırma değiştirildiğinde, güncelleştirmeler genellikle hızla etkili olur ancak anında gerçekleşir. Bazen, bir yapılandırma değişikliğinin etkili olabilmesi için bir App Service yeniden başlatılması için kısa bir süre beklemeniz gerekir.
Sertifika belirteci imzalama ile Azure App Service barındırın
Bu bölümdeki kılavuz şunları açıklamaktadır:
- Blazor WebAssembly Identity Azure App Serviceiçin sunucu ile barındırılan bir uygulama dağıtma.
- Sunucu belirteci imzalama için bir TLS sertifikası oluşturma ve kullanma Identity .
Not
Bu bölümdeki kılavuzdan sonra HTTPS protokol iletişimine yönelik bir TLS sertifikası oluşturup dağıtmak için, bu makalenin Azure App Service bölümünde HTTPS protokol iletişimi için özel etki alanı ve TLS sertifikası kullanma bölümüne bakın.
Aşağıdaki kılavuzda, yalnızca sunucu belirteci imzalama için Azure Key Vault ' de otomatik olarak imzalanan bir sertifika oluşturulur Identity . Identitysunucu yapılandırması, Windows App Service ve Linux App Service farklı yaklaşımlarını izleyen anahtar kasası sertifikasını kullanır:
- Windows App Service: uygulamanın
CurrentUser>Mysertifika deposuna, sertifikayı yüklemek için uygulama tarafından erişilir. - Linux App Service: uygulama sertifikayı el ile yükler.
Uyarı
IdentitySunucu belirteci imzalama ve özel etki alanı için bir sertifika kullanmak istediğinizde , sunucunun belirteç imzalama için aynı SERTIFIKAYı Identity ve sitenin https güvenli iletişimini, tarayıcıyla birlikte kullanmayın:
- Bu iki gereksinim için farklı sertifikaların kullanılması, her amaçla özel anahtarları yalıtdığından iyi bir güvenlik uygulamasıdır.
- Tarayıcılarla iletişim için TLS sertifikaları, sunucunun belirteç imzasını etkilemeden bağımsız olarak yönetilir Identity .
- Azure Key Vault , özel etki alanı bağlamaya yönelik bir App Service uygulamasına sertifika sağladığı zaman, Identity sunucu, belirteç imzalama için Azure Key Vault aynı sertifikayı elde edemiyor. IdentitySunucuyu fiziksel bir yoldan aynı TLS sertifikasını kullanacak şekilde yapılandırmak mümkün olsa da, güvenlik sertifikalarının kaynak denetimine yerleştirilmesi kötü bir uygulamadır ve çoğu senaryoda kaçınılmalıdır.
Bir uygulamayı, Azure App Service ve Azure Key Vault bir özel belirteç imzalama sertifikasıyla barındıracak şekilde yapılandırmak için:
App Service planıoluşturun.
Not
Basic B1Aynı zamanda uygulamayla bir veya daha fazla özel etki alanı kullanmayı planlıyorsanız, plan düzeyi veya daha yüksek katman içeren App Service bir plan gereklidir.Yeni bir Azure Key Vault oluşturun veya Azure aboneliğinizde mevcut bir anahtar kasasını kullanın.
Azure Key Vault, sunucu belirteci imzalama için otomatik olarak imzalanan yeni bir sertifika oluşturun Identity . Sertifikaya bir sertifika adı ve Konu verin. Konusu ,
CN={COMMON NAME}{COMMON NAME}yer tutucunun sertifikanın ortak adı olduğu gibi belirtilir. Ortak ad herhangi bir alfasayısal dize olabilir. Örneğin,CN=IdentityServerSigninggeçerli bir sertifika konusudur. Varsayılan Gelişmiş Ilke yapılandırma ayarlarını kullanın.Sertifikayı oluşturmak için aşağıdaki yaklaşımlardan birini veya başka bir uygun aracı ya da çevrimiçi hizmeti kullanın:
Uygulamanın yapılandırmasında daha sonra kullanılan sertifikanın parmak izini kaydedin.
Azure Key Vault sertifikaları hakkında daha fazla bilgi için bkz. Azure Key Vault: sertifikalar.
Azure portal Azure App Service gidin ve aşağıdaki yapılandırmayla yeni bir App Service oluşturun:
- Kümeyi olarak Yayımla
Code. - Çalışma zamanı yığını , uygulamanın çalışma zamanına ayarlandı.
- SKU ve boyut için App Service katmanının
Basic B1veya daha yüksek olduğunu doğrulayın. App Service, birBasic B1veya daha yüksek hizmet katmanının özel etki alanlarını kullanmasını gerektirir.
- Kümeyi olarak Yayımla
Azure App Service oluşturduktan sonra uygulamanın yapılandırmasını açın ve daha önce kaydedilen sertifika parmak izini belirten yeni bir uygulama ayarı ekleyin. Uygulama ayarı anahtarı
WEBSITE_LOAD_CERTIFICATES:- Anahtar:
WEBSITE_LOAD_CERTIFICATES - Değer:
57443A552A46DB...D55E28D412B943565
Azure portal, uygulama ayarlarının kaydedilmesi iki adımlı bir işlemdir:
WEBSITE_LOAD_CERTIFICATESanahtar-değer ayarını kaydedin, ardından dikey pencerenin en üstündeki Kaydet düğmesini seçin.- Anahtar:
Uygulamanın TLS/SSL ayarlarını seçin. Özel anahtar sertifikaları (. pfx) seçeneğini belirleyin. Sitenin otomatik olarak imzalanan sunucu belirteci imzalama sertifikasını içeri aktarmak için Key Vault sertifikayı Içeri aktar işlemini kullanın Identity .
uygulamayı, Windows App Service veya Linux App Service tercih ettiğiniz konak işletim sistemine göre belirteç imzalama sertifikasını kullanacak şekilde yapılandırın:
Windows App Service
Visual Studio, sunucu projesinin uygulama ayarları dosyasını (
appsettings.jsonveyaappsettings.Production.json) açın. IdentitySunucu yapılandırması ' nda aşağıdakiKeybölümü ekleyin. Anahtar için otomatik olarak imzalanan sertifika konusunu belirtinName. Aşağıdaki örnekte, sertifikanın anahtar kasasında atanan ortak adı ' dır;IdentityServerSigningBu da bir konuyu verenCN=IdentityServerSigning:"IdentityServer": { ... "Key": { "Type": "Store", "StoreName": "My", "StoreLocation": "CurrentUser", "Name": "CN=IdentityServerSigning" } },Windows App Service bir sertifika yükleme sorununu giderirken, bir Azure portal kudu PowerShell komut kabuğu 'nda aşağıdaki komutu yürütün. Komut, uygulamanın sertifika deposundan erişebileceği sertifikaların bir listesini sağlar
CurrentUser>My. Çıktıda sertifika konuları ve parmak izleri, bir uygulamada hata ayıklanırken yararlı olur:Get-ChildItem -path Cert:\CurrentUser\My -Recurse | Format-List DnsNameList, Subject, Thumbprint, EnhancedKeyUsageListLinux App Service
Linux, bir TLS sertifikası yüklemek için Windows sertifika deposu kullanamaz. Linux App Service, sertifikalar yola yerleştirilir
/var/ssl/private/. Sertifikayı önceki yoldan el ile yükleyin ve kullanın.Aşağıdaki ad alanları sunucu projesindeki en üstünde zaten mevcut değilse
Startup.cs, bunları dosyasına ekleyin:using System; using System.IO; using System.Security.Cryptography.X509Certificates;' De
Startup.ConfigureServices, Identity sunucu yapılandırmasını el ile yüklenmiş bir sertifika kullanacak şekilde güncelleştirin. Aşağıdaki örnekte,{THUMBPRINT}yer tutucu sertifikanın parmak izine sahiptir:var certPath = "/var/ssl/private/{THUMBPRINT}.p12"; if (File.Exists(certPath)) { var bytes = File.ReadAllBytes(certPath); var certificate = new X509Certificate2(bytes); services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => { }) .AddSigningCredential(certificate); } else { throw new FileNotFoundException($"Certificate path: {certPath}."); }Bu Visual Studio, Sunucu Azure App Service için bir yayımlama profili oluşturun. Menü çubuğundan Şu seçeneği belirleyin: Yeni Azure > Azure App Service > > > (Windows Linux) yayımlayın. Bir Visual Studio Azure aboneliğine bağlı olduğunuzda, Azure kaynaklarının Görünümünü Kaynak türüne göre ayarlayın. Web Uygulaması listesinde gezinerek uygulamanın App Service seçin. Son'u seçin.
Bu Visual Studio yayımla penceresine döndüğünde anahtar kasası ve SQL Server veritabanı hizmeti bağımlılıkları otomatik olarak algılanır.
Anahtar kasası hizmeti için varsayılan ayarlarda yapılandırma değişikliği gerekmez.
Test amacıyla, şablon tarafından varsayılan olarak yapılandırılan bir uygulamanın yerel SQLite veritabanı, ek yapılandırma olmadan Blazor uygulamayla dağıtılabilir. Üretimde Sunucu için farklı Identity bir veritabanı yapılandırmak bu makalenin kapsamının dışındadır. Daha fazla bilgi için aşağıdaki belge kümelerinde veritabanı kaynaklarına bakın:
Uygulamayı yayımlayın. Visual Studio bir tarayıcı penceresi açar ve siteyi talep açar.
Azure belgeleri, Azure hizmetlerini kullanma hakkında ek ayrıntılar içerir. Aşağıdaki kaynaklara bakın:
Uygulama, uygulama yapılandırması veya uygulama yapılandırmasında yapılan bir değişiklik sonrasında her uygulama test çalıştırması için yeni bir özel veya gizli tarayıcı penceresi Azure portal. Önceki bir test çalıştırmasına bağlı kalanlar, site yapılandırması doğru olsa bile siteyi test etmek için başarısız kimlik doğrulaması cookie veya yetkilendirmeye neden olabilir. Her test çalıştırması için Visual Studio özel veya gizli tarayıcı penceresi açmak üzere yapılandırma hakkında daha fazla bilgi için Cookie s ve site verileri bölümüne bakın.
Yapılandırma App Service değişiklik Azure portal güncelleştirmeler genellikle hızlı bir şekilde etkili olur ancak anlık olmaz. Bazen yapılandırma değişikliğinin etkili olması için bir App Service için kısa bir süre beklemeniz gerekir.
Https protokolü iletişimi için özel bir etki alanı ve TLS sertifikası Azure App Service
Bu bölümdeki kılavuzda, bir uygulamaya dağıtılmış bir uygulamanın tarayıcıları ile HTTPS protokolü iletişimi için TLS sertifikası oluşturma ve kullanma Azure App Service. Kılavuz, sertifikayı özel bir etki alanıyla kullanmaya odaklansa da, kılavuz varsayılan Azure Apps etki alanının (örneğin, ) kullanımına eşit olarak contoso.azurewebsites.net geçerlidir.
Not
Bu bölümdeki kılavuzda, uygulamanın daha önce Azure App Service. App Service dağıtım App Service, bu bölümdeki kılavuzu kullanmadan önce Azure App Service ile belirteç imzalama senaryoları bölümündeki yönergeleri izleyin.
Bir uygulamayı yapılandırmak Azure App Service ve Azure Key Vault etki alanı ve HTTPS ile barındırabilirsiniz:
Bir App Service düzeyi veya daha yüksek olan bir
Basic B1plan kullanın. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.Sitenin güvenli tarayıcı iletişimi (HTTPS protokolü) için, sitenin tam etki alanı adının (FQDN) ortak bir adıyla (örneğin, ) bir PFX sertifikası
www.contoso.comoluşturun. Sertifikayı şu şekilde oluşturun:- Anahtar kullanımları
- Dijital imza doğrulaması (
digitalSignature) - Anahtar şifrelemesi (
keyEncipherment)
- Dijital imza doğrulaması (
- Gelişmiş/genişletilmiş anahtar kullanımları
- İstemci Kimlik Doğrulaması (1.3.6.1.5.5.7.3.2)
- Sunucu Kimlik Doğrulaması (1.3.6.1.5.5.7.3.1)
Sertifikayı oluşturmak için aşağıdaki yaklaşımlardan birini veya diğer uygun araç ya da çevrimiçi hizmetlerden birini kullanın:
Daha sonra sertifikayı sertifikayı sertifikaya içeri aktarmada kullanılan parolayı Azure Key Vault.
Sertifikalar hakkında daha Azure Key Vault için bkz. Azure Key Vault: Sertifikalar.
- Anahtar kullanımları
Azure aboneliğinde Azure Key Vault bir anahtar kasası oluşturun veya var olan bir anahtar kasasını kullanın.
Anahtar kasasının Sertifikalar alanında PFX site sertifikasını içeri aktarın. Daha sonra uygulamanın yapılandırmasında kullanılan sertifikanın parmak izini kaydetme.
Sku Azure App Service boyutu için Azure portal katmanında, depolama katmanının App Service daha yüksek
Basic B1olduğunu onaylayın. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.Uygulamanın Yapılandırma'App Service açın ve anahtarıyla yeni bir uygulama ayarı ekleyin (henüz yoksa) veya mevcut uygulama
WEBSITE_LOAD_CERTIFICATESWEBSITE_LOAD_CERTIFICATESayarını değiştirme. Daha önce kaydedilen TLS sertifikasının sertifika parmak izini belirtin:- Otomatik belirteç imzalama kullanılırken, HTTPS iletişimi için yalnızca tek bir parmak izi olur. Örnek anahtar:
WEBSITE_LOAD_CERTIFICATESÖrnek değer:57443A552A46DB...D55E28D412B943565 - Ayrı bir belirteç imzalama sertifikası kullanırken, ayar için parmak izi değerleri virgülle ayrılmış iki parmak izi vardır. Örnek anahtar:
WEBSITE_LOAD_CERTIFICATESÖrnek değer:57443A552A46DB...D55E28D412B943565,29F43A772CB6AF...1D04F0C67F85FB0B1
Bu Azure portal uygulama ayarlarını kaydetme iki adımlı bir işlemdir: Anahtar-değer ayarını kaydedin ve dikey penceresindeki Kaydet
WEBSITE_LOAD_CERTIFICATESdüğmesini seçin.- Otomatik belirteç imzalama kullanılırken, HTTPS iletişimi için yalnızca tek bir parmak izi olur. Örnek anahtar:
Uygulamanın TLS/SSL ayarlarını seçin. Özel Anahtar Sertifikaları (.pfx) öğesini seçin. Sitenin HTTPS Key Vault sertifikasını içeri almak için Sertifikayı İçeri Aktar işlemini kullanın.
Özel etki alanları dikey penceresine gidin. Etki alanı kayıt şirketinizin web sitesinde, etki alanını yapılandırmak için IP adresini Custom Domain doğrulama kimliğini kullanın. Tipik bir etki alanı yapılandırması şunları içerir:
- Konak ve ip adresi değerine sahip bir A
@Kaydı Azure portal. - Konak ve Azure tarafından oluşturulan ve kimlik doğrulaması tarafından sağlanan doğrulama kimliğinin değerine sahip txt
asuidAzure portal.
Değişiklikleri etki alanı kayıt şirketinizin web sitesinde doğru şekilde kaydetmeyi doğrulayın. Bazı kayıt şirketi web siteleri, etki alanı kayıtlarını kaydetmek için iki adımlı bir işlem gerektirir: Bir veya daha fazla kayıt tek tek kaydedilir ve ardından etki alanının kaydı ayrı bir düğmeyle güncelleştirmeyi içerir.
- Konak ve ip adresi değerine sahip bir A
Uygulamanın Özel etki alanları dikey penceresine Azure portal. Özel etki alanı ekle'yi seçin. A Kaydı seçeneğini belirleyin. Etki alanını s sağlama ve Doğrula'yi seçin. Etki alanı kayıtları doğruysa ve İnternet'e yayıldıysa portal, Özel etki alanı ekle düğmesini seçmenize olanak sağlar.
Etki alanı kayıt şirketiniz tarafından işlendikten sonra etki alanı kayıt değişikliklerinin İnternet etki alanı adı sunucularına (DNS) yayılması birkaç gün sürer. Etki alanı kayıtları üç iş günü içinde güncelleştirilmezse, kayıtların etki alanı kayıt şirketiyle doğru şekilde ayar olduğunu onaylayın ve müşteri desteğine başvurun.
Özel etki alanları dikey penceresinde, etki alanının SSL DURUMU olarak
Not Secureişaretlenir. Bağlama ekle bağlantısını seçin. Özel etki alanı bağlaması için anahtar kasasında site HTTPS sertifikasını seçin.
Azure belgeleri, A kayıtları yerine CNAME kayıtlarını kullanma hakkında bilgiler dahil olmak üzere azure hizmetlerinde ve özel etki alanlarında TLS bağlaması ile App Service kullanma hakkında ek ayrıntılar içerir. Daha fazla bilgi için aşağıdaki kaynaklara bakın:
- App Service belgeleri
- Öğretici: Mevcut özel DNS adını Azure App Service'e eşleme
- TlS/SSL bağlaması ile özel bir DNS adının güvenliğini Azure App Service
- Azure Key Vault
Uygulama, uygulama yapılandırması veya uygulama yapılandırmasında yapılan bir değişiklik sonrasında her uygulama test çalıştırması için yeni bir özel veya gizli tarayıcı penceresi Azure portal. Önceki bir test çalıştırmasına bağlı kalanlar, site yapılandırması doğru olsa bile siteyi test etmek için başarısız kimlik doğrulaması cookie veya yetkilendirmeye neden olabilir. Her test çalıştırması için Visual Studio özel veya gizli tarayıcı penceresi açmak üzere yapılandırma hakkında daha fazla bilgi için Cookie s ve site verileri bölümüne bakın.
Yapılandırma App Service değişiklik Azure portal güncelleştirmeler genellikle hızlı bir şekilde etkili olur ancak anlık olmaz. Bazen yapılandırma değişikliğinin etkili olması için bir App Service için kısa bir süre beklemeniz gerekir.
Windows App Service'da bir sertifika yükleme sorunu Azure portal Kudu PowerShell komut kabuğunda aşağıdaki komutu yürütün. Komut, uygulamanın sertifika depolamadan erişenin sertifika listesini CurrentUser > My sağlar. Çıktı, bir uygulamada hata ayıklarken yararlı olan sertifika konularını ve parmak izini içerir:
Get-ChildItem -path Cert:\CurrentUser\My -Recurse | Format-List DnsNameList, Subject, Thumbprint, EnhancedKeyUsageList
Sorun giderme
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ırma nedeniyle oluşur. Aşağıda birkaç örnek verilmiştir:
- Senaryonun gereksinimlerine bağlı olarak, eksik veya yanlış bir yetkili, örnek, kiracı KIMLIĞI, kiracı etki alanı, Istemci KIMLIĞI veya yeniden yönlendirme URI 'SI, bir uygulamanın istemcilerin kimliğini doğrulamasını önler.
- Yanlış bir erişim belirteci kapsamı, istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Yanlış veya eksik sunucu API izinleri istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Uygulamayı, sağlayıcının uygulama kaydının yeniden yönlendirme URI 'sinde yapılandırılmış olandan farklı bir bağlantı noktasında çalıştırmak Identity .
Bu makalenin kılavuzunun yapılandırma bölümlerinde doğru yapılandırma örnekleri gösterilmektedir. Uygulama ve IP yanlış yapılandırmayla ilgili makalenin her bölümüne dikkatle göz atın.
Yapılandırma doğru görünüyorsa:
Uygulama günlüklerini analiz edin.
Tarayıcı geliştirici araçlarıyla istemci uygulaması ile IP veya sunucu uygulaması arasındaki ağ trafiğini inceleyin. Genellikle, bir istek yapıldıktan sonra, hataya neden olan bir hata iletisi veya bir sorun olduğunu bir ileti, 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)
Bir istemcinin kimliğini doğrulamak için kullanılan bir JSON Web Token (JWT) içeriğinin kodunu çözün veya sorunun nerede oluştuğunu bağlı olarak bir sunucu Web API 'sine erişim. Daha fazla bilgi için bkz. bir JSON Web token (JWT) Içeriğini İnceleme.
Belgeler, makalelerdeki belge geri bildirimlerine ve hatalara yanıt veriyor ( Bu sayfa geri bildirimi bölümünden bir sorun açar), ancak ürün desteği sağlayamadı. Bir uygulamanın sorunlarını gidermeye yardımcı olmak için çeşitli genel destek forumları vardır. Şunları öneririz:
Önceki Forumlar Microsoft tarafından sahip değil veya denetlenmiyor.
güvenlikle ilgili olmayan, hassas olmayan ve gizli olmayan bir dizi framework hata raporu için ASP.NET Core ürün birimiyle bir sorun açın. Bir sorunun nedenini iyice araştırmadan ve bir genel destek forumundaki topluluk yardımıyla, ürün birimiyle ilgili bir sorun açmayın. Ürün birimi, basit yanlış yapılandırma veya üçüncü taraf hizmetleri içeren durumlar nedeniyle bozuk olan ayrı uygulamalarla ilgili sorunları gideremez. bir rapor hassas veya gizli ise ve saldırganların yararlanabilecek potansiyel bir güvenlik kusurunu kullanıyorsa, bkz. raporlama güvenlik sorunları ve hataları (dotnet/aspnetcore GitHub repository).
AAD için yetkisiz istemci
bilgi: Microsoft. AspNetCore. Authorization. DefaultAuthorizationService [2] yetkilendirmesi başarısız oldu. Bu gereksinimler karşılanmadı: DenyAnonymousAuthorizationRequirement: kimliği doğrulanmış bir kullanıcı gerektirir.
AAD oturum açma geri çağırma hatası:
- Hata:
unauthorized_client - Açıklaması
AADB2C90058: The provided application is not configured to allow public clients.
Hatayı gidermek için:
- Azure portal, uygulamanın bildirimineerişin.
-
allowPublicClientÖzniteliğini veya olarak ayarlayınnulltrue.
- Hata:
Cookies ve site verileri
Cookies ve site verileri, uygulama güncelleştirmelerinde devam edebilir ve test ve sorun giderme işlemlerini etkileyebilir. Uygulama kodu değişiklikleri yaparken, sağlayıcı ile Kullanıcı hesabı değişiklikleri veya sağlayıcı uygulama yapılandırma değişiklikleri yaparken aşağıdakileri temizleyin:
- Kullanıcı oturum açma cookie öğeleri
- Uygulama cookie s
- Önbelleğe alınmış ve depolanan site verileri
Kalan cookie s ve site verilerinin test ve sorun giderme konusunda kesintiye uğramasını önleyen bir yaklaşım:
- Tarayıcı yapılandırma
- cookieTarayıcı her kapatıldığında tüm ve site verilerini silmek üzere yapılandırabileceğiniz test için bir tarayıcı kullanın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasının herhangi bir değişikliği için tarayıcının el ile veya IDE tarafından kapatıldığından emin olun.
- Visual Studio ' deki bir tarayıcıyı veya özel modda açmak için özel bir komut kullanın:
- Visual Studio çalıştır düğmesinden , 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 konuma yüklenirse veya Windows 10 kullanmıyorsanız, tarayıcının yürütülebilir dosyasının yolunu belirtin.
- 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 ınbilito veya Private modunda 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: Use
--incognito --new-window {URL}, yer tutucunun{URL}açılacağı URL (örneğin,https://localhost:5001). - Mozilla Firefox: Use
-private -url {URL}, yer tutucunun{URL}açılacağı URL (ö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.
- Her bir uygulamayla test yinelemesi için tarayıcı profilini seçmek zorunda kalmamak için, profili varsayılan olarak Ayarla düğmesi ile varsayılan olarak ayarlayın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasındaki herhangi bir değişiklik için, tarayıcının IDE tarafından kapatıldığından emin olun.
Uygulama yükseltmeleri
Çalışan bir uygulama, geliştirme makinesindeki .NET Core SDK yükseltmeden veya uygulama içindeki paket sürümlerini değiştirirken hemen başarısız olabilir. Bazı durumlarda, önemli paketler ana yükseltmeler gerçekleştirirken bir uygulamayı bozabilir. Bu sorunların çoğu aşağıdaki yönergeleri izleyerek düzeltilebilir:
- bir komut kabuğundan yürüterek yerel sistemin NuGet paketi önbelleklerini temizleyin
dotnet nuget locals all --clear. - Proje
binveobjklasörlerini silin. - Projeyi geri yükleyin ve yeniden derleyin.
- Uygulamayı yeniden dağıtmadan önce sunucusundaki dağıtım klasöründeki tüm dosyaları silin.
Not
Uygulamanın hedef çerçevesiyle uyumsuz paket sürümlerinin kullanımı desteklenmez. bir paket hakkında daha fazla bilgi için NuGet galerisi veya fuget paket gezgininikullanın.
Sunucu uygulamasını çalıştırma
Barındırılan bir çözümü test etmek ve sorunlarını giderirken Blazor , uygulamayı projeden çalıştırdığınızdan emin olun Server . örneğin Visual Studio ' de, aşağıdaki yaklaşımlardan biriyle uygulamaya başlamadan önce sunucu projesinin Çözüm Gezgini vurgulandığını doğrulayın:
- Çalıştır düğmesini seçin.
- Menüden hata > ayıklamayı Başlat komutunu kullanın.
- F5tuşuna basın.
JSON Web Token (JWT) içeriğini İnceleme
Bir JSON Web Token (JWT) kodunu çözmek için Microsoft 'un JWT.MS aracını kullanın. Kullanıcı arabirimindeki değerler hiçbir şekilde tarayıcınızdan bırakmayın.
Örnek kodlanmış JWT (görüntülenmek üzere kısaltıldı):
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j ... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q
Azure AAD B2C 'da kimlik doğrulayan bir uygulama için araç tarafından kodu çözülen örnek JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
"exp": 1610059429,
"nbf": 1610055829,
"ver": "1.0",
"iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
"sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
"aud": "70bde375-fce3-4b82-984a-b247d823a03f",
"nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
"iat": 1610055829,
"auth_time": 1610055822,
"idp": "idp.com",
"tfp": "B2C_1_signupsignin"
}.[Signature]
Ek kaynaklar
- Azure App Service'a dağıtım
- Sertifikayı Key Vault (Azure belgeleri)
- Blazor WebAssemblyASP.NET Core ek güvenlik senaryoları
- Güvenli varsayılan istemciye sahip bir uygulamada kimliği doğrulanmamış veya yetkisiz web API'si istekleri
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma: Aşağıdakiler hakkında rehberlik içerir:
- Proxy sunucuları ve iç ağlar arasında HTTPS şeması bilgilerini korumak için Iletili Üst Bilgiler Ara Yazılımı kullanma.
- El ile şema yapılandırması, doğru istek yönlendirmesi için istek yolu değişiklikleri ve Linux ve IIS olmayan ters sunuculara istek şemasını iletme gibi ek senaryolar ve kullanım örnekleri.
Bu makalede, kullanıcıların ve API çağrılarının kimliğini Blazor WebAssembly doğrulamak için Sunucu kullanan Identity barındırılan bir çözümün nasıl oluşturularak ilgili açıklanmıştır.
Not
Tek başına veya barındırılan bir uygulamayı var olan bir dış Sunucu örneğini kullanmak Blazor WebAssembly Identity üzere yapılandırmak için, 'de yönergeleri Kimlik doğrulama ASP.NET Core Blazor WebAssembly tek başına bir uygulamanın güvenliğini sağlama izleyin.
Kimlik doğrulama Blazor WebAssembly mekanizmasıyla yeni bir proje oluşturmak için:
Yeni bir proje oluşturma.
Uygulama Blazor WebAssembly şablonunu seçin. İleri’yi seçin.
Tire Project bir ad girin (aşağıdaki UYARI'ya bakın). Konum'ın doğru olduğunu onaylayın. İleri’yi seçin.
Uyarı
Proje adı içinde
-OIDC uygulama tanımlayıcısının oluşmasını bozan tireler ( ) kullanmaktan kaçının. Proje Blazor WebAssembly şablonunda mantık, çözümün yapılandırmasında bir OIDC uygulama tanımlayıcısı için proje adını kullanır. Pascal büyük/küçükBlazorSampleharf ( ) veya alt çizgi ( ) kabul edilebilirBlazor_Samplealternatiflerdir. Daha fazla bilgi için bkz. Barındırılan proje adı kesme Blazor WebAssembly OIDC güvenliğinde tireler (dotnet/aspnetcore #35337).Ek bilgiler iletişim kutusunda Kimlik Doğrulama Türü olarak Bireysel Hesaplar'ı seçerek kullanıcıları uygulamanın içinde, ASP.NET Core sistemiyle Identity depolar.
Barındırılan ASP.NET Core onay kutusunu seçin.
Server uygulama yapılandırması
Aşağıdaki bölümlerde, kimlik doğrulama desteği dahil edilirken projeye yapılan eklemeler açıklanmaktadır.
Başlangıç sınıfı
sınıfı Startup aşağıdaki eklemelere sahip.
Startup.ConfigureServicesiçinde:ASP.NET Core Identity:
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>();IdentitySunucu'ya AddApiAuthorization ek bir yardımcı yönteme sahip sunucu, ASP.NET Core kuralları Identity ayarlar:
services.AddIdentityServer() .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();Sunucu tarafından üretilen JWT belirteçlerini doğrulamak için uygulamayı yapılandıran ek bir yardımcı AddIdentityServerJwt yöntem ile kimlik Identity doğrulaması:
services.AddAuthentication() .AddIdentityServerJwt();
Startup.Configureiçinde:Sunucu Identity ara yazılımı OpenID uç Bağlan (OIDC) uç noktalarını gösterir:
app.UseIdentityServer();Kimlik doğrulama ara yazılımı, istek kimlik bilgilerini doğrulamadan ve kullanıcının istek bağlamında ayarlandıktan sorumludur:
app.UseAuthentication();Yetkilendirme Ara Yazılımı yetkilendirme özelliklerini sağlar:
app.UseAuthorization();
Linux üzerinde Azure App Service
Linux üzerinde Azure App Service'a dağıtırken, onu Linux üzerinde Azure App Service. Daha fazla bilgi için bkz. ASP.NET Core'de Tek Sayfalı Uygulamalar için kimlik doğrulamasına giriş.
AddApiAuthorization
Yardımcı AddApiAuthorization yöntemi, Identity Sunucu'ASP.NET Core yapılandırıyor. IdentitySunucu, uygulama güvenliğiyle ilgili sorunları ele alan güçlü ve genişletilebilir bir çerçevedir. IdentitySunucu, en yaygın senaryolar için gereksiz karmaşıklıkları ortaya çıkarır. Sonuç olarak, iyi bir başlangıç noktası olarak değerlendiren bir dizi kural ve yapılandırma seçeneği sağlanır. Kimlik doğrulaması gereksinimleriniz değişti mi, kimlik doğrulamasını uygulamanın gereksinimlerine uyacak şekilde özelleştirmek için Identity Sunucu'nun tüm gücü kullanılabilir.
IdentityServerJwt ekleme
Yardımcı AddIdentityServerJwt yöntemi, varsayılan kimlik doğrulama işleyicisi olarak uygulama için bir ilke şeması yapılandırıyor. İlke, URL alanı içinde Identity herhangi bir alt yola yönlendirilen tüm istekleri işlemeye izin verecek Identity şekilde /Identity yapılandırılır. diğer JwtBearerHandler tüm istekleri işler. Ayrıca, bu yöntem:
- Varsayılan
{APPLICATION NAME}APIkapsamına sahip bir API Identity kaynağını Sunucu'ya{APPLICATION NAME}APIkaydettirer. - Uygulama için Sunucu tarafından verilen belirteçleri doğrulamak için JWT Taşıyıcı Belirteci Identity Ara Yazılımı'nın yapılandırılması.
WeatherForecastController
() WeatherForecastController Controllers/WeatherForecastController.cs [Authorize] içinde, özniteliği sınıfına uygulanır. özniteliği, kullanıcının kaynağa erişmek için varsayılan ilkeye göre yetkilendirilmiş olması gerektiğini gösterir. Varsayılan yetkilendirme ilkesi, tarafından ayarlanmış varsayılan kimlik doğrulama düzenini kullanmak üzere AddIdentityServerJwt yapılandırılmıştır. Yardımcı yöntemi, uygulamaya JwtBearerHandler yapılan istekler için varsayılan işleyici olarak yapılandırılır.
ApplicationDbContext
içinde ApplicationDbContext ( Data/ApplicationDbContext.cs ), Sunucu DbContext ApiAuthorizationDbContext<TUser> şemasını içerecek şekilde Identity genişlettir. ApiAuthorizationDbContext<TUser> , 'den IdentityDbContext türetildi.
Veritabanı şemasının tam denetimine sahip olmak için, kullanılabilir sınıflardan birini devralın ve yöntemini çağırarak Identity DbContext Identity bağlamı şemayı içerecek şekilde builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value) OnModelCreating yapılandırın.
OidcConfigurationController
içinde OidcConfigurationController , Controllers/OidcConfigurationController.cs istemci uç noktası OIDC parametrelerine hizmet verecek şekilde sağlandı.
Uygulama ayarları
Proje kökünde uygulama ayarları dosyasındaki ( ) appsettings.json bölümünde IdentityServer yapılandırılan istemcilerin listesi açıklandı. Aşağıdaki örnekte tek bir istemci var. İstemci adı uygulama adına karşılık gelen ve kural tarafından OAuth parametresiyle ClientId eşlenen. Profil yapılandırılan uygulama türünü gösterir. Profil, sunucu için yapılandırma işlemini basitleştirmeye yardımcı olan kuralları oluşturmak için dahili olarak kullanılır.
"IdentityServer": {
"Clients": {
"{APP ASSEMBLY}.Client": {
"Profile": "IdentityServerSPA"
}
}
}
Yer {APP ASSEMBLY} tutucu, uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Client uygulama yapılandırması
Kimlik doğrulama paketi
Bireysel Kullanıcı Hesaplarını () kullanmak için bir uygulama oluşturulduğunda, uygulama otomatik olarak uygulamanın proje dosyasında Individual paket için bir paket başvurusu Microsoft.AspNetCore.Components.WebAssembly.Authentication alır. Paket, uygulamanın kullanıcıların kimliğini doğrulamasını ve korumalı API'leri çağıracak belirteçleri almasını sağlayan bir temel öğeler kümesi sağlar.
Uygulamaya kimlik doğrulaması ekliyorsanız paketi uygulamanın proje dosyasına el ile ekleyin:
<PackageReference
Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication"
Version="{VERSION}" />
yer tutucusu için, uygulamanın paylaşılan çerçeve sürümüyle eşleşen paketin en son kararlı sürümü NuGet.org adresinde paketin Sürüm Geçmişi {VERSION} içinde bulunabilir.
HttpClient Yapılandırma
içinde, adlı ( ) sunucu API'sini istekleri yaparken erişim Program.cs HttpClient {APP ASSEMBLY}.ServerAPI HttpClient belirteçleri içeren örnekleri sağlamak üzere yapılandırılır:
builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI",
client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("{APP ASSEMBLY}.ServerAPI"));
Yer {APP ASSEMBLY} tutucu, uygulamanın derleme adıdır (örneğin, BlazorSample.Client ).
Not
Bir uygulamayı barındırılan bir çözümün parçası olmayan mevcut bir Sunucu örneğini kullanmak üzere yapılandırıyorsanız, temel adres kaydını ( ) sunucu uygulamasının API yetkilendirme uç noktası Blazor WebAssembly Identity Blazor HttpClient IWebAssemblyHostEnvironment.BaseAddress builder.HostEnvironment.BaseAddress URL'si olarak değiştirebilirsiniz.
API yetkilendirme desteği
Kullanıcıların kimliklerini doğrulama desteği, paket içinde sağlanan uzantı yöntemiyle hizmet kapsayıcısı içine Microsoft.AspNetCore.Components.WebAssembly.Authentication takılıdır. Bu yöntem, uygulamanın mevcut yetkilendirme sistemiyle etkileşim kurması için gereken hizmetleri ayarlar.
builder.Services.AddApiAuthorization();
Varsayılan olarak, uygulamanın yapılandırması kuralına göre _configuration/{client-id} yüklenir. Kural gereği, istemci kimliği uygulamanın derleme adına ayarlanır. Bu URL, seçeneklerle aşırı yükleme çağrılarak ayrı bir uç noktaya işaret etmek için değiştirilebilir.
dosyayı içeri aktarma
Microsoft.AspNetCore.Components.AuthorizationAd alanı, uygulama boyunca dosya aracılığıyla kullanılabilir hale getirilir _Imports.razor :
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared
Dizin sayfası
Dizin sayfası ( wwwroot/index.html ) sayfası JavaScript içinde tanımlayan bir komut dosyası içerir AuthenticationService . AuthenticationService OıDC protokolünün alt düzey ayrıntılarını işler. Uygulama, kimlik doğrulama işlemlerini gerçekleştirmek için komut dosyasında tanımlanan yöntemleri dahili olarak çağırır.
<script src="_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/
AuthenticationService.js"></script>
Uygulama bileşeni
Bileşeni App ( ) uygulamalarda bulunan App.razor App bileşene Blazor Server benzer:
- Bileşeni, CascadingAuthenticationState uygulamanın geri AuthenticationState kalanına ifşayı yönetir.
- Bileşen, AuthorizeRouteView geçerli kullanıcının belirli bir sayfaya erişme yetkisine sahip olduğundan veya başka bir şekilde bileşeni işlemeye yetkili olduğundan emin
RedirectToLoginolur. - Bileşen,
RedirectToLoginyetkisiz kullanıcıları oturum açma sayfasına yeniden yönlendirmeyi yönetir.
ASP.NET Core'nin yayınlarında çerçevede yapılan değişikliklerden dolayı, bu bölümde Razor App bileşenin ( App.razor ) işaretlemesi gösterilmez. Bileşenin verilen bir sürüme yönelik işaretlemelerini incelemek için aşağıdaki yaklaşımlardan birini kullanın:
Kullanmak istediğiniz uygulamanın sürümü için varsayılan proje şablonundan kimlik Blazor WebAssembly doğrulaması için ASP.NET Core bir uygulama oluşturun. Oluşturulan
Appuygulamada bileşeniApp.razor( ) inceleme.Başvuru
AppkaynağındaApp.razorbileşeni ( ) inceleme.Not
Belge, ASP.NET Core kaynağı yüklemesi için ürün biriminin bir sonraki sürümü için geçerli geliştirmeyi temsil eden deponun dal
mainASP.NET Core. Farklı bir sürümün dallarını seçmek için Dalları veya etiketleri değiştir açılan listesini kullanarak dalı seçin. Örneğin, ASP.NET Corerelease/5.05.0 sürümü için dalı seçin.
RedirectToLogin bileşeni
RedirectToLoginBileşen ( Shared/RedirectToLogin.razor ):
- Yetkisiz kullanıcıların oturum açma sayfasına yeniden yönlendirildiğini yönetir.
- Kimlik doğrulaması başarılı olursa bu sayfaya döndürülmeleri için kullanıcının erişmeye çalışan geçerli URL 'YI korur.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
protected override void OnInitialized()
{
Navigation.NavigateTo(
$"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
}
}
LoginDisplay bileşeni
Bileşeni LoginDisplay ( Shared/LoginDisplay.razor ) bileşeninde işlenir ( ) ve aşağıdaki MainLayout davranışları Shared/MainLayout.razor yönetir:
- Kimliği doğrulanmış kullanıcılar için:
- Geçerli kullanıcı adını görüntüler.
- içinde kullanıcı profili sayfasına bir bağlantı ASP.NET Core Identity sunar.
- Uygulamada oturumun açık olduğu bir düğme sunar.
- Anonim kullanıcılar için:
- Kaydolma seçeneği sunar.
- Oturum açma seçeneği sunar.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager
<AuthorizeView>
<Authorized>
<a href="authentication/profile">Hello, @context.User.Identity.Name!</a>
<button class="nav-link btn btn-link" @onclick="BeginSignOut">
Log out
</button>
</Authorized>
<NotAuthorized>
<a href="authentication/register">Register</a>
<a href="authentication/login">Log in</a>
</NotAuthorized>
</AuthorizeView>
@code {
private async Task BeginSignOut(MouseEventArgs args)
{
await SignOutManager.SetSignOutState();
Navigation.NavigateTo("authentication/logout");
}
}
Kimlik doğrulama bileşeni
Bileşeni ( ) tarafından Authentication üretilen Pages/Authentication.razor sayfa, farklı kimlik doğrulama aşamalarını işleme için gereken yolları tanımlar.
RemoteAuthenticatorViewBileşen:
- Paketi tarafından
Microsoft.AspNetCore.Components.WebAssembly.Authenticationsağlanır. - Kimlik doğrulamasının her aşamasında uygun eylemleri gerçekleştirmeyi yönetir.
@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
<RemoteAuthenticatorView Action="@Action" />
@code {
[Parameter]
public string Action { get; set; }
}
FetchData bileşeni
Bileşen FetchData şunların nasıl olduğunu gösterir:
- Erişim belirteci sağlama.
- Sunucu uygulamasında korumalı bir kaynak API'sini aramak için erişim belirteci kullanın.
@attribute [Authorize]yönergesi, yetkilendirme sistemine kullanıcının bu bileşeni ziyaret etmek için Blazor WebAssembly yetkilendirilmiş olması gerektiğini gösterir. Uygulamada özniteliğinin Client olması, sunucu üzerinde API'nin düzgün kimlik bilgileri olmadan çağrılması engellemez. Uygulamanın Server bunları doğru şekilde korumak için uygun uç noktaları da [Authorize] kullanması gerekir.
IAccessTokenProvider.RequestAccessToken , API'yi çağırma isteğine eklen bir erişim belirteci isteğiyle ilgilenmeyi sağlar. Belirteç önbelleğe alınmışsa veya hizmet kullanıcı etkileşimi olmadan yeni bir erişim belirteci sağlandı ise, belirteç isteği başarılı olur. Aksi takdirde, belirteç isteği deyiminde AccessTokenNotAvailableException yakalanan ile başarısız try-catch olur.
İstekte yer alan gerçek belirteci elde etmek için, uygulamanın çağırarak isteğin başarılı olup olduğunu denetlemesi tokenResult.TryGetToken(out var token) gerekir.
İstek başarılı olursa, belirteç değişkeni erişim belirteci ile doldurulur. AccessToken.ValueBelirteci özelliği, istek üst bilgisinde yer alan değişmez Authorization dizeyi gösterir.
belirteç kullanıcı etkileşimi olmadan sağlanamadı nedeniyle istek başarısız olursa, belirteç sonucu bir yeniden yönlendirme URL'si içerir. Bu URL'ye giderek kullanıcı, başarılı bir kimlik doğrulamasının ardından oturum açma sayfasına ve geçerli sayfaya geri döner.
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http
...
@code {
private WeatherForecast[] forecasts;
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
catch (AccessTokenNotAvailableException exception)
{
exception.Redirect();
}
}
}
Uygulamayı çalıştırma
Uygulamayı Sunucu projesinden çalıştırın. Şu Visual Studio:
- Araç çubuğundaki Başlangıç Projeleri açılan listesini Sunucu API'si uygulamasına ayarlayın ve Çalıştır düğmesini seçin.
- Sunucu projesini seçin Çözüm Gezgini araç çubuğunda Çalıştır düğmesini seçin veya Hata Ayıklama menüsünden uygulamayı çalıştırın.
API yetkilendirmesi ile ad ve rol talebi
Özel kullanıcı fabrikası
Uygulamada Client özel bir kullanıcı fabrikası oluşturun. Identity Sunucu, tek bir talepte JSON dizisi olarak birden çok rol role gönderir. Talepte dize değeri olarak tek bir rol gönderilir. Fabrika, kullanıcının role rollerinin her biri için ayrı bir talep oluşturur.
CustomUserFactory.cs:
using System.Linq;
using System.Security.Claims;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
public class CustomUserFactory
: AccountClaimsPrincipalFactory<RemoteUserAccount>
{
public CustomUserFactory(IAccessTokenProviderAccessor accessor)
: base(accessor)
{
}
public override async ValueTask<ClaimsPrincipal> CreateUserAsync(
RemoteUserAccount account,
RemoteAuthenticationUserOptions options)
{
var user = await base.CreateUserAsync(account, options);
if (user.Identity.IsAuthenticated)
{
var identity = (ClaimsIdentity)user.Identity;
var roleClaims = identity.FindAll(identity.RoleClaimType).ToArray();
if (roleClaims.Any())
{
foreach (var existingClaim in roleClaims)
{
identity.RemoveClaim(existingClaim);
}
var rolesElem = account.AdditionalProperties[identity.RoleClaimType];
if (rolesElem is JsonElement roles)
{
if (roles.ValueKind == JsonValueKind.Array)
{
foreach (var role in roles.EnumerateArray())
{
identity.AddClaim(new Claim(options.RoleClaim, role.GetString()));
}
}
else
{
identity.AddClaim(new Claim(options.RoleClaim, roles.GetString()));
}
}
}
}
return user;
}
}
Uygulamada Client fabrikayı 'a Program.cs kaydettirin:
builder.Services.AddApiAuthorization()
.AddAccountClaimsPrincipalFactory<CustomUserFactory>();
Uygulamada, Server AddRoles rolle ilgili Identity hizmetler ekleyen oluşturucuda çağrısı:
using Microsoft.AspNetCore.Identity;
...
services.AddDefaultIdentity<ApplicationUser>(options =>
options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
Sunucuyu Identity Yapılandırma
Aşağıdaki yaklaşımlardan birini kullanın:
API yetkilendirme seçenekleri
Uygulamada: Server
- IdentitySunucu'ya ve
nametaleplerini kimlikrolebelirteci ve erişim belirteci içine alacak şekilde yapılandırma. - JWT belirteci işleyicisinde roller için varsayılan eşlemeyi engelin.
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
...
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options => {
options.IdentityResources["openid"].UserClaims.Add("name");
options.ApiResources.Single().UserClaims.Add("name");
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
});
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Profil Hizmeti
Uygulamada Server bir uygulama ProfileService oluşturun.
ProfileService.cs:
using IdentityModel;
using IdentityServer4.Models;
using IdentityServer4.Services;
using System.Threading.Tasks;
public class ProfileService : IProfileService
{
public ProfileService()
{
}
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var nameClaim = context.Subject.FindAll(JwtClaimTypes.Name);
context.IssuedClaims.AddRange(nameClaim);
var roleClaims = context.Subject.FindAll(JwtClaimTypes.Role);
context.IssuedClaims.AddRange(roleClaims);
await Task.CompletedTask;
}
public async Task IsActiveAsync(IsActiveContext context)
{
await Task.CompletedTask;
}
}
Uygulamada, Server Profil Hizmeti'nin kaydını 'a Startup.ConfigureServices tıklayın:
using IdentityServer4.Services;
...
services.AddTransient<IProfileService, ProfileService>();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Yetkilendirme mekanizmalarını kullanma
Uygulamada Client bileşen yetkilendirme yaklaşımları bu noktada işlevseldir. Bileşenlerde bulunan yetkilendirme mekanizmalarının herhangi biri, kullanıcıya yetkilendirmek için bir rol kullanabilir:
AuthorizeViewbileşen (Örnek:<AuthorizeView Roles="admin">)[Authorize]attribute yönergesi AuthorizeAttribute ( ) (Örnek:@attribute [Authorize(Roles = "admin")])Yordam mantığı (Örnek:
if (user.IsInRole("admin")) { ... })Birden çok rol testi de destekler:
if (user.IsInRole("admin") && user.IsInRole("developer")) { ... }
User.Identity.Name uygulamada genellikle Client oturum açma e-posta adresi olan kullanıcının kullanıcı adıyla doldurulur.
UserManager ve SignInManager
Bir sunucu uygulaması gerektirdiğinde Kullanıcı tanımlayıcısı talep türünü ayarlayın:
- UserManager<TUser> ya da SignInManager<TUser> BIR API uç noktasında.
- IdentityUser kullanıcının adı, e-posta adresi veya kilitleme bitiş saati gibi ayrıntılar.
Program.csASP.NET Core 6,0 veya üzeri için:
using System.Security.Claims;
...
builder.Services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Startup.ConfigureServices6,0 ' den önceki ASP.NET Core sürümleri için:
using System.Security.Claims;
...
services.Configure<IdentityOptions>(options =>
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
Aşağıdaki, WeatherForecastController UserName yöntemi çağrıldığında günlüğe kaydedilir Get :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using {APP NAMESPACE}.Server.Models;
using {APP NAMESPACE}.Shared;
namespace {APP NAMESPACE}.Server.Controllers
{
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly UserManager<ApplicationUser> userManager;
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm",
"Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
UserManager<ApplicationUser> userManager)
{
this.logger = logger;
this.userManager = userManager;
}
[HttpGet]
public async Task<IEnumerable<WeatherForecast>> Get()
{
var rng = new Random();
var user = await userManager.GetUserAsync(User);
if (user != null)
{
logger.LogInformation($"User.Identity.Name: {user.UserName}");
}
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
}
Özel Azure App Service ve sertifika ile konak
Aşağıdaki kılavuzda aşağıdakiler açık açıklamalıdır:
- Sunucu ile barındırılan bir Blazor WebAssembly uygulamayı özel bir etki Identity Azure App Service sunucuya dağıtma.
- Tarayıcılarla HTTPS protokolü iletişimi için TLS sertifikası oluşturma ve kullanma. Kılavuz sertifikayı özel bir etki alanıyla kullanmaya odaklansa da, kılavuz varsayılan Azure Apps etki alanının kullanımına eşit olarak geçerlidir, örneğin
contoso.azurewebsites.net.
Bu barındırma senaryosunda, Sunucunun belirteç Identity imzalama anahtarı ve sitenin tarayıcılarla https güvenli iletişimi için aynı sertifikayı kullanmayın:
- Bu iki gereksinimler için farklı sertifikalar kullanmak iyi bir güvenlik uygulamasıdır çünkü her amaç için özel anahtarları yalıtır.
- Tarayıcılarla iletişim için TLS sertifikaları, Sunucunun belirteç imzalamasını Identity etkilemeden bağımsız olarak yönetilir.
- Sunucu Azure Key Vault özel etki alanı bağlaması için App Service uygulamasına sertifika sağlarken, Sunucu belirteç imzalama için Azure Key Vault Identity sertifikayı alamaz. Sunucuyu fiziksel bir yoldan aynı TLS sertifikasını kullanmak üzere yapılandırmak mümkün olsa da, güvenlik sertifikalarını kaynak denetimine yerleştirmek kötü bir uygulamadır ve çoğu senaryoda Identity kaçınılmalıdır.
Aşağıdaki kılavuzda, yalnızca Sunucu belirteci imzalama için Azure Key Vault bir otomatik olarak Identity imzalanan sertifika oluşturulur. Sunucu Identity yapılandırması, uygulamanın sertifika deposu aracılığıyla anahtar kasası CurrentUser > My sertifikasını kullanır. Özel etki alanlarıyla HTTPS trafiği için kullanılan diğer sertifikalar Sunucu imzalama sertifikasından ayrı olarak Identity oluşturulur ve yapılandırılır.
Bir uygulamayı yapılandırmak için Azure App Service ve Azure Key Vault etki alanı ve HTTPS ile barındırabilirsiniz:
Plan App Service daha yüksek bir plan
Basic B1oluşturun. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.Sitenin güvenli tarayıcı iletişimi (HTTPS protokolü) için, sitenin tam etki alanı adının (FQDN) ortak bir adıyla (örneğin, ) bir PFX sertifikası
www.contoso.comoluşturun. Sertifikayı şu şekilde oluşturun:- Anahtar kullanımları
- Dijital imza doğrulaması (
digitalSignature) - Anahtar şifrelemesi (
keyEncipherment)
- Dijital imza doğrulaması (
- Gelişmiş/genişletilmiş anahtar kullanımları
- İstemci Kimlik Doğrulaması (1.3.6.1.5.5.7.3.2)
- Sunucu Kimlik Doğrulaması (1.3.6.1.5.5.7.3.1)
Sertifikayı oluşturmak için aşağıdaki yaklaşımlardan birini veya diğer uygun araç ya da çevrimiçi hizmetlerden birini kullanın:
Daha sonra sertifikayı sertifikayı sertifikaya içeri aktarmada kullanılan parolayı Azure Key Vault.
Sertifikalar hakkında daha Azure Key Vault için bkz. Azure Key Vault: Sertifikalar.
- Anahtar kullanımları
Azure aboneliğinde Azure Key Vault yeni bir anahtar kasası oluşturun veya var olan bir anahtar kasasını kullanın.
Anahtar kasasının Sertifikalar alanında PFX site sertifikasını içeri aktarın. Daha sonra uygulamanın yapılandırmasında kullanılan sertifikanın parmak izini kaydetme.
Bu Azure Key Vault, Sunucu belirteci imzalama için yeni bir otomatik Identity olarak imzalanan sertifika oluştur. Sertifikaya bir Sertifika Adı ve Konu girin. Konu olarak
CN={COMMON NAME}belirtilir; burada yer tutucu{COMMON NAME}sertifikanın ortak adıdır. Ortak ad herhangi bir alfasayısal dize olabilir. Örneğin, geçerliCN=IdentityServerSigningbir sertifika Konudur. Varsayılan Gelişmiş İlke Yapılandırması ayarlarını kullanın. Daha sonra uygulamanın yapılandırmasında kullanılan sertifikanın parmak izini kaydetme.Azure App Service'Azure portal gidin ve aşağıdaki yapılandırmayla App Service yeni bir hesap oluşturun:
- Yayımlama olarak
Codeayarlanmış. - Çalışma zamanı yığını, uygulamanın çalışma zamanının çalışma zamanı olarak ayarlanır.
- Sku ve boyut için, depolama katmanının App Service daha yüksek
Basic B1olduğunu onaylayın. App Service etki alanlarınıBasic B1kullanmak için bir veya daha yüksek bir hizmet katmanı gerekir.
- Yayımlama olarak
Azure uygulamayı App Service sonra uygulamanın Yapılandırma'sını açın ve daha önce kaydedilen sertifika parmak izini belirten yeni bir uygulama ayarı ekleyin. Uygulama ayarı anahtarı şu
WEBSITE_LOAD_CERTIFICATESşekildedir: . Aşağıdaki örnekte olduğu gibi, uygulama ayarı değerindeki sertifika parmak izini virgülle ayırabilirsiniz:- Anahtar:
WEBSITE_LOAD_CERTIFICATES - Değer:
57443A552A46DB...D55E28D412B943565,29F43A772CB6AF...1D04F0C67F85FB0B1
Bu Azure portal uygulama ayarlarını kaydetme iki adımlı bir işlemdir: Anahtar-değer ayarını kaydedin ve dikey penceresindeki Kaydet
WEBSITE_LOAD_CERTIFICATESdüğmesini seçin.- Anahtar:
Uygulamanın TLS/SSL ayarlarını seçin. Özel Anahtar Sertifikaları (.pfx) öğesini seçin. Hem sitenin HTTPS Key Vault hem de sitenin otomatik olarak imzalanan Sunucu belirteci imzalama sertifikasını içeri almak için Sertifikayı İçeri Aktar işlemini iki Identity kez kullanın.
Özel etki alanları dikey penceresine gidin. Etki alanı kayıt şirketinizin web sitesinde, etki alanını yapılandırmak için IP adresini Custom Domain doğrulama kimliğini kullanın. Tipik bir etki alanı yapılandırması şunları içerir:
- Konak ve ip adresi değerine sahip bir A
@Kaydı Azure portal. - Konak ve Azure tarafından oluşturulan ve kimlik doğrulaması tarafından sağlanan doğrulama kimliğinin değerine sahip txt
asuidAzure portal.
Değişiklikleri etki alanı kayıt şirketinizin web sitesinde doğru şekilde kaydetmeyi doğrulayın. Bazı kayıt şirketi web siteleri, etki alanı kayıtlarını kaydetmek için iki adımlı bir işlem gerektirir: Bir veya daha fazla kayıt tek tek kaydedilir ve ardından etki alanının kaydı ayrı bir düğmeyle güncelleştirmeyi içerir.
- Konak ve ip adresi değerine sahip bir A
Uygulamanın Özel etki alanları dikey penceresine Azure portal. Özel etki alanı ekle'yi seçin. A Kaydı seçeneğini belirleyin. Etki alanını s sağlama ve Doğrula'yi seçin. Etki alanı kayıtları doğruysa ve İnternet'e yayıldıysa portal, Özel etki alanı ekle düğmesini seçmenize olanak sağlar.
Etki alanı kayıt şirketiniz tarafından işlendikten sonra, etki alanı kaydı değişikliklerinin Internet etki alanı ad sunucuları (DNS) üzerinden yayılması birkaç gün sürebilir. Etki alanı kayıtları üç iş günü içinde güncellenmemişse, kayıtların etki alanı kaydedicisinde doğru şekilde ayarlandığını onaylayın ve müşteri desteğiyle iletişim kurun.
Özel etki alanları dikey penceresinde, etki alanı IÇIN SSL durumu işaretlenir
Not Secure. Bağlama Ekle bağlantısını seçin. Özel etki alanı bağlamasının anahtar kasasından site HTTPS sertifikasını seçin.Visual Studio, sunucu projesinin uygulama ayarları dosyasını (
appsettings.jsonveyaappsettings.Production.json) açın. IdentitySunucu yapılandırması ' nda aşağıdakiKeybölümü ekleyin. Anahtar için otomatik olarak imzalanan sertifika konusunu belirtinName. Aşağıdaki örnekte, sertifikanın anahtar kasasında atanan ortak adı ' dır;IdentityServerSigningBu da bir konuyu verenCN=IdentityServerSigning:"IdentityServer": { ... "Key": { "Type": "Store", "StoreName": "My", "StoreLocation": "CurrentUser", "Name": "CN=IdentityServerSigning" } },Visual Studio, sunucu projesi için bir Azure App Service yayımlama profili oluşturun. menü çubuğundan: derleme > > yeni > Azure > Azure App Service yayımlama (Windows veya Linux) seçeneğini belirleyin. Visual Studio bir azure aboneliğine bağlandığında, azure kaynaklarının görünümünü kaynak türüne göre ayarlayabilirsiniz. Uygulamanın App Service bulmak ve bunu seçmek için Web uygulaması listesinde gezinin. Son'u seçin.
Visual Studio yayımla penceresine döndüğünde, anahtar kasası ve SQL Server veritabanı hizmeti bağımlılıkları otomatik olarak algılanır.
Anahtar Kasası hizmeti için varsayılan ayarlarda yapılandırma değişikliği yapılması gerekmez.
Test amacıyla, bir uygulamanın varsayılan olarak şablon tarafından yapılandırılan yerel SQLite veritabanı, Blazor ek yapılandırma olmadan uygulamayla birlikte dağıtılabilir. Üretimde sunucu için farklı bir veritabanını yapılandırmak, Identity Bu makalenin kapsamı dışındadır. Daha fazla bilgi için aşağıdaki belge kümelerinde veritabanı kaynaklarına bakın:
Pencerenin üst kısmındaki dağıtım profili adı altındaki Düzenle bağlantısını seçin. Hedef URL 'yi sitenin özel etki alanı URL 'SI olarak değiştirin (örneğin,
https://www.contoso.com). Ayarları kaydedin.Uygulamayı yayımlayın. Visual Studio bir tarayıcı penceresi açar ve siteyi kendi özel etki alanında ister.
Azure belgeleri, Azure hizmetleri ve özel etki alanlarını, bir kayıt yerine CNAME kayıtlarını kullanma hakkında bilgi dahil olmak üzere App Service 'de TLS bağlama ile kullanmayla ilgili ek bilgiler içerir. Daha fazla bilgi için aşağıdaki kaynaklara bakın:
- App Service belgeleri
- Öğretici: Mevcut özel DNS adını Azure App Service'e eşleme
- Azure App Service 'de TLS/SSL bağlaması ile özel bir DNS adının güvenliğini sağlama
- Azure Key Vault
Uygulama, uygulama yapılandırması veya Azure portal Azure hizmetlerinde yapılan bir değişiklikten sonra her uygulama test çalışması için yeni bir özel veya geçersiz tarayıcı penceresi kullanmanızı öneririz. cookieÖnceki bir test çalıştırağından kalan öğeleri, site yapılandırması doğru olsa bile siteyi test ederken başarısız kimlik doğrulama veya yetkilendirmeyle sonuçlanabilir. Visual Studio yapılandırma hakkında daha fazla bilgi için, her test çalıştırmasında yeni bir özel veya bir tarayıcı penceresi açmak üzere, Cookie s ve site verileri bölümüne bakın.
Azure portal App Service yapılandırma değiştirildiğinde, güncelleştirmeler genellikle hızla etkili olur ancak anında gerçekleşir. Bazen, bir yapılandırma değişikliğinin etkili olabilmesi için bir App Service yeniden başlatılması için kısa bir süre beklemeniz gerekir.
Bir sertifika yükleme sorununu giderirken, Azure portal kudu PowerShell komut kabuğu 'nda aşağıdaki komutu yürütün. Komut, uygulamanın sertifika deposundan erişebileceği sertifikaların bir listesini sağlar CurrentUser > My . Çıktıda sertifika konuları ve parmak izleri, bir uygulamada hata ayıklanırken yararlı olur:
Get-ChildItem -path Cert:\CurrentUser\My -Recurse | Format-List DnsNameList, Subject, Thumbprint, EnhancedKeyUsageList
Sorun giderme
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ırma nedeniyle oluşur. Aşağıda birkaç örnek verilmiştir:
- Senaryonun gereksinimlerine bağlı olarak, eksik veya yanlış bir yetkili, örnek, kiracı KIMLIĞI, kiracı etki alanı, Istemci KIMLIĞI veya yeniden yönlendirme URI 'SI, bir uygulamanın istemcilerin kimliğini doğrulamasını önler.
- Yanlış bir erişim belirteci kapsamı, istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Yanlış veya eksik sunucu API izinleri istemcilerin sunucu Web API uç noktalarına erişmesini önler.
- Uygulamayı, sağlayıcının uygulama kaydının yeniden yönlendirme URI 'sinde yapılandırılmış olandan farklı bir bağlantı noktasında çalıştırmak Identity .
Bu makalenin kılavuzunun yapılandırma bölümlerinde doğru yapılandırma örnekleri gösterilmektedir. Uygulama ve IP yanlış yapılandırmayla ilgili makalenin her bölümüne dikkatle göz atın.
Yapılandırma doğru görünüyorsa:
Uygulama günlüklerini analiz edin.
Tarayıcı geliştirici araçlarıyla istemci uygulaması ile IP veya sunucu uygulaması arasındaki ağ trafiğini inceleyin. Genellikle, bir istek yapıldıktan sonra, hataya neden olan bir hata iletisi veya bir sorun olduğunu bir ileti, 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)
Bir istemcinin kimliğini doğrulamak için kullanılan bir JSON Web Token (JWT) içeriğinin kodunu çözün veya sorunun nerede oluştuğunu bağlı olarak bir sunucu Web API 'sine erişim. Daha fazla bilgi için bkz. bir JSON Web token (JWT) Içeriğini İnceleme.
Belgeler, makalelerdeki belge geri bildirimlerine ve hatalara yanıt veriyor ( Bu sayfa geri bildirimi bölümünden bir sorun açar), ancak ürün desteği sağlayamadı. Bir uygulamanın sorunlarını gidermeye yardımcı olmak için çeşitli genel destek forumları vardır. Şunları öneririz:
Önceki Forumlar Microsoft tarafından sahip değil veya denetlenmiyor.
güvenlikle ilgili olmayan, hassas olmayan ve gizli olmayan bir dizi framework hata raporu için ASP.NET Core ürün birimiyle bir sorun açın. Bir sorunun nedenini iyice araştırmadan ve bir genel destek forumundaki topluluk yardımıyla, ürün birimiyle ilgili bir sorun açmayın. Ürün birimi, basit yanlış yapılandırma veya üçüncü taraf hizmetleri içeren durumlar nedeniyle bozuk olan ayrı uygulamalarla ilgili sorunları gideremez. bir rapor hassas veya gizli ise ve saldırganların yararlanabilecek potansiyel bir güvenlik kusurunu kullanıyorsa, bkz. raporlama güvenlik sorunları ve hataları (dotnet/aspnetcore GitHub repository).
AAD için yetkisiz istemci
bilgi: Microsoft. AspNetCore. Authorization. DefaultAuthorizationService [2] yetkilendirmesi başarısız oldu. Bu gereksinimler karşılanmadı: DenyAnonymousAuthorizationRequirement: kimliği doğrulanmış bir kullanıcı gerektirir.
AAD oturum açma geri çağırma hatası:
- Hata:
unauthorized_client - Açıklaması
AADB2C90058: The provided application is not configured to allow public clients.
Hatayı gidermek için:
- Azure portal, uygulamanın bildirimineerişin.
-
allowPublicClientÖzniteliğini veya olarak ayarlayınnulltrue.
- Hata:
Cookies ve site verileri
Cookies ve site verileri, uygulama güncelleştirmelerinde devam edebilir ve test ve sorun giderme işlemlerini etkileyebilir. Uygulama kodu değişiklikleri yaparken, sağlayıcı ile Kullanıcı hesabı değişiklikleri veya sağlayıcı uygulama yapılandırma değişiklikleri yaparken aşağıdakileri temizleyin:
- Kullanıcı oturum açma cookie öğeleri
- Uygulama cookie s
- Önbelleğe alınmış ve depolanan site verileri
Kalan cookie s ve site verilerinin test ve sorun giderme konusunda kesintiye uğramasını önleyen bir yaklaşım:
- Tarayıcı yapılandırma
- cookieTarayıcı her kapatıldığında tüm ve site verilerini silmek üzere yapılandırabileceğiniz test için bir tarayıcı kullanın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasının herhangi bir değişikliği için tarayıcının el ile veya IDE tarafından kapatıldığından emin olun.
- Visual Studio ' deki bir tarayıcıyı veya özel modda açmak için özel bir komut kullanın:
- Visual Studio çalıştır düğmesinden , 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 konuma yüklenirse veya Windows 10 kullanmıyorsanız, tarayıcının yürütülebilir dosyasının yolunu belirtin.
- 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 ınbilito veya Private modunda 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: Use
--incognito --new-window {URL}, yer tutucunun{URL}açılacağı URL (örneğin,https://localhost:5001). - Mozilla Firefox: Use
-private -url {URL}, yer tutucunun{URL}açılacağı URL (ö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.
- Her bir uygulamayla test yinelemesi için tarayıcı profilini seçmek zorunda kalmamak için, profili varsayılan olarak Ayarla düğmesi ile varsayılan olarak ayarlayın.
- Uygulamanın, test kullanıcısının veya sağlayıcı yapılandırmasındaki herhangi bir değişiklik için, tarayıcının IDE tarafından kapatıldığından emin olun.
Uygulama yükseltmeleri
Çalışan bir uygulama, geliştirme makinesindeki .NET Core SDK yükseltmeden veya uygulama içindeki paket sürümlerini değiştirirken hemen başarısız olabilir. Bazı durumlarda, önemli paketler ana yükseltmeler gerçekleştirirken bir uygulamayı bozabilir. Bu sorunların çoğu aşağıdaki yönergeleri izleyerek düzeltilebilir:
- bir komut kabuğundan yürüterek yerel sistemin NuGet paketi önbelleklerini temizleyin
dotnet nuget locals all --clear. - Proje
binveobjklasörlerini silin. - Projeyi geri yükleyin ve yeniden derleyin.
- Uygulamayı yeniden dağıtmadan önce sunucusundaki dağıtım klasöründeki tüm dosyaları silin.
Not
Uygulamanın hedef çerçevesiyle uyumsuz paket sürümlerinin kullanımı desteklenmez. bir paket hakkında daha fazla bilgi için NuGet galerisi veya fuget paket gezgininikullanın.
Sunucu uygulamasını çalıştırma
Barındırılan bir çözümü test etmek ve sorunlarını giderirken Blazor , uygulamayı projeden çalıştırdığınızdan emin olun Server . örneğin Visual Studio ' de, aşağıdaki yaklaşımlardan biriyle uygulamaya başlamadan önce sunucu projesinin Çözüm Gezgini vurgulandığını doğrulayın:
- Çalıştır düğmesini seçin.
- Menüden hata > ayıklamayı Başlat komutunu kullanın.
- F5tuşuna basın.
JSON Web Token (JWT) içeriğini İnceleme
Bir JSON Web Token (JWT) kodunu çözmek için Microsoft 'un JWT.MS aracını kullanın. Kullanıcı arabirimindeki değerler hiçbir şekilde tarayıcınızdan bırakmayın.
Örnek kodlanmış JWT (görüntülenmek üzere kısaltıldı):
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j ... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q
Azure AAD B2C 'da kimlik doğrulayan bir uygulama için araç tarafından kodu çözülen örnek JWT:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
"exp": 1610059429,
"nbf": 1610055829,
"ver": "1.0",
"iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
"sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
"aud": "70bde375-fce3-4b82-984a-b247d823a03f",
"nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
"iat": 1610055829,
"auth_time": 1610055822,
"idp": "idp.com",
"tfp": "B2C_1_signupsignin"
}.[Signature]
Ek kaynaklar
- Azure App Service dağıtım
- Key Vault bir sertifikayı içeri aktarma (Azure belgeleri)
- Blazor WebAssemblyASP.NET Core ek güvenlik senaryoları
- Güvenli bir varsayılan istemciyle bir uygulamada kimliği doğrulanmamış veya yetkilendirilmemiş Web API istekleri
- Yapılandırma ASP.NET Core sunucuları ve yük dengeciler ile çalışacak şekilde yapılandırma: Üzerine yönergeler içerir:
- WAN sunucularında ve iç ağlarda HTTPS şema bilgilerini korumak için Iletilen üstbilgiler ara yazılımı kullanma.
- El ile düzen yapılandırması, doğru istek yönlendirme için istek yolu değişiklikleri ve Linux ve IIS olmayan ters proxy 'ler için istek düzenini iletme dahil ek senaryolar ve kullanım örnekleri.