Aracılığıyla paylaş


Kimlik doğrulaması ve yetkilendirme

Kimlik doğrulaması, bir kullanıcıdan ad ve parola gibi kimlik bilgilerini alma ve bu kimlik bilgilerini bir yetkiliye karşı doğrulama işlemidir. Kimlik bilgileri geçerliyse, kimlik bilgilerini gönderen varlık kimliği doğrulanmış kimlik olarak kabul edilir. Kimlik oluşturulduktan sonra, yetkilendirme işlemi bu kimliğin belirli bir kaynağa erişimi olup olmadığını belirler.

kimlik doğrulaması ve yetkilendirmeyi ASP.NET bir web uygulamasıyla iletişim kuran bir .NET MAUI uygulamasıyla tümleştirmeye yönelik ASP.NET Core Identity, Microsoft, Google, Facebook veya Twitter gibi dış kimlik doğrulama sağlayıcıları ve kimlik doğrulama ara yazılımı gibi birçok yaklaşım vardır. eShop çok platformlu uygulaması, IdentityServer kullanan kapsayıcılı bir kimlik mikro hizmetiyle kimlik doğrulaması ve yetkilendirme gerçekleştirir. Uygulama, bir kullanıcının kimliğini doğrulamak veya bir kaynağa erişmek için IdentityServer'dan güvenlik belirteçleri ister. IdentityServer'ın bir kullanıcı adına belirteçler vermesi için kullanıcının IdentityServer'da oturum açması gerekir. Ancak, IdentityServer kimlik doğrulaması için bir kullanıcı arabirimi veya veritabanı sağlamaz. Bu nedenle eShop başvuru uygulamasında bu amaçla ASP.NET Çekirdek Kimlik kullanılmaktadır.

Kimlik Doğrulaması

Bir uygulamanın geçerli kullanıcının kimliğini bilmesi gerektiğinde kimlik doğrulaması gerekir. ASP.NET Core'un kullanıcıları tanımlamaya yönelik birincil mekanizması, kullanıcı bilgilerini geliştirici tarafından yapılandırılan bir veri deposunda depolayan ASP.NET Core Identity üyelik sistemidir. Genellikle bu veri deposu bir EntityFramework deposu olur, ancak özel depolar veya üçüncü taraf paketler Kimlik bilgilerini Azure depolama, DocumentDB veya diğer konumlarda depolamak için kullanılabilir.

Yerel kullanıcı veri deposu kullanan ve tanımlama bilgileri aracılığıyla istekler arasında kimlik bilgilerini kalıcı hale getiren (ASP.NET web uygulamalarında olduğu gibi) kimlik doğrulama senaryoları için ASP.NET Core Identity uygun bir çözümdür. Ancak tanımlama bilgileri her zaman verileri kalıcı hale ve iletim için doğal bir araç değildir. Örneğin, bir uygulamadan erişilen RESTful uç noktalarını kullanıma sunan bir ASP.NET Core web uygulamasının genellikle taşıyıcı belirteç kimlik doğrulamasını kullanması gerekir çünkü tanımlama bilgileri bu senaryoda kullanılamaz. Ancak taşıyıcı belirteçler kolayca alınabilir ve uygulamadan yapılan web isteklerinin yetkilendirme üst bilgisine eklenebilir.

IdentityServer kullanarak taşıyıcı belirteçleri verme

IdentityServer , ASP.NET Core için açık kaynaklı bir OpenID Connect ve OAuth 2.0 çerçevesidir ve yerel ASP.NET Core Identity kullanıcıları için güvenlik belirteçleri verme dahil olmak üzere birçok kimlik doğrulama ve yetkilendirme senaryosu için kullanılabilir.

Not

OpenID Connect ve OAuth 2.0 birbirine çok benzer ve farklı sorumluluklara sahiptir.

OpenID Connect, OAuth 2.0 protokolünün üzerindeki bir kimlik doğrulama katmanıdır. OAuth 2, uygulamaların bir güvenlik belirteci hizmetinden erişim belirteçleri istemesine ve bunları API'lerle iletişim kurmak için kullanmasına olanak tanıyan bir protokoldür. Kimlik doğrulaması ve yetkilendirme merkezileştirilebildiği için bu temsilci seçme hem istemci uygulamalarında hem de API'lerde karmaşıklığı azaltır.

OpenID Connect ve OAuth 2.0, kimlik doğrulaması ve API erişimiyle ilgili iki temel güvenlik kaygısını birleştirir ve IdentityServer bu protokollerin bir uygulamasıdır.

eShop başvuru uygulaması gibi doğrudan istemciden mikro hizmete iletişimi kullanan uygulamalarda, aşağıdaki diyagramda gösterildiği gibi, kullanıcıların kimliğini doğrulamak için Güvenlik Belirteci Hizmeti (STS) olarak davranan ayrılmış bir kimlik doğrulama mikro hizmeti kullanılabilir. Doğrudan istemciden mikro hizmete iletişim hakkında daha fazla bilgi için bkz . Mikro hizmetler.

Ayrılmış bir kimlik doğrulama mikro hizmeti tarafından kimlik doğrulaması.

eShop çok platformlu uygulama kimlik doğrulaması ve API'ler için erişim denetimi gerçekleştirmek için IdentityServer kullanan kimlik mikro hizmetiyle iletişim kurar. Bu nedenle, çok platformlu uygulama bir kullanıcının kimliğini doğrulamak veya bir kaynağa erişmek için IdentityServer'dan belirteçler ister:

  • IdentityServer ile kullanıcıların kimlik doğrulaması, kimlik doğrulama işleminin sonucunu temsil eden bir kimlik belirteci isteyen çok platformlu uygulama tarafından gerçekleştirilir. En azından, kullanıcı için bir tanımlayıcı ve kullanıcının kimliğinin nasıl ve ne zaman doğrulanmış olduğu hakkında bilgi içerir. Ayrıca ek kimlik verileri de içerebilir.
  • IdentityServer ile bir kaynağa erişim, bir API kaynağına erişime izin veren erişim belirteci isteyen çok platformlu uygulama tarafından elde edilir. İstemciler erişim belirteçleri talep eder ve bunları API'ye iletir. Erişim belirteçleri, varsa istemci ve kullanıcı hakkında bilgi içerir. API'ler daha sonra verilerine erişim yetkisi vermek için bu bilgileri kullanır.

Not

İstemcinin belirteçleri başarıyla isteyebilmesi için önce IdentityServer'a kaydedilmesi gerekir. İstemci ekleme hakkında daha fazla bilgi için bkz . İstemcileri Tanımlama.

Web uygulamasına IdentityServer ekleme

ASP.NET Core web uygulamasının IdentityServer kullanması için web uygulamasının Visual Studio çözümüne eklenmesi gerekir. Daha fazla bilgi için IdentityServer belgelerindeki Kurulum ve Genel Bakış'a bakın. IdentityServer web uygulamasının Visual Studio çözümüne eklendikten sonra, OpenID Connect ve OAuth 2.0 uç noktalarına istek sunmak için HTTP isteği işleme işlem hattına eklenmelidir. Bu, aşağıdaki kod örneğinde Identity.API gösterildiği gibi projenin Program.cs yapılandırılır:


...

app.UseIdentityServer();

Sipariş, web uygulamasının HTTP isteği işleme işlem hattında önemlidir. Bu nedenle, identityserver oturum açma ekranını uygulayan ui çerçevesi önce işlem hattına eklenmelidir.

IdentityServer'ın Yapılandırılması

IdentityServer, eShop başvuru uygulamasındaki Identity.API aşağıdaki kod örneğinde gösterildiği gibi yöntemini çağırarak projenin AddIdentityServer yapılandırılır:

builder.Services.AddIdentityServer(options =>
    {
        options.Authentication.CookieLifetime = TimeSpan.FromHours(2);
    
        options.Events.RaiseErrorEvents = true;
        options.Events.RaiseInformationEvents = true;
        options.Events.RaiseFailureEvents = true;
        options.Events.RaiseSuccessEvents = true;
    
        // TODO: Remove this line in production.
        options.KeyManagement.Enabled = false;
    })
    .AddInMemoryIdentityResources(Config.GetResources())
    .AddInMemoryApiScopes(Config.GetApiScopes())
    .AddInMemoryApiResources(Config.GetApis())
    .AddInMemoryClients(Config.GetClients(builder.Configuration))
    .AddAspNetIdentity<ApplicationUser>()
    // TODO: Not recommended for production - you need to store your key material somewhere secure
    .AddDeveloperSigningCredential();

yöntemi çağrıldıktan services.AddIdentityServer sonra, aşağıdakileri yapılandırmak için ek akıcı API'ler çağrılır:

  • İmzalama için kullanılan kimlik bilgileri.
  • Kullanıcıların erişim isteyebileceği API ve kimlik kaynakları.
  • İstek belirteçlerine bağlanacak istemciler.
  • ASP.NET Çekirdek Kimliği.

İpucu

IdentityServer yapılandırmasını dinamik olarak yükleyin. IdentityServer'ın API'leri, yapılandırma nesnelerinin bellek içi listesinden IdentityServer'ın yapılandırılmasına olanak tanır. eShop başvuru uygulamasında, bu bellek içi koleksiyonlar uygulamaya sabit kodlanmıştır. Ancak üretim senaryolarında bunlar bir yapılandırma dosyasından veya veritabanından dinamik olarak yüklenebilir.

IdentityServer'ı ASP.NET Çekirdek Kimliği kullanacak şekilde yapılandırma hakkında bilgi için, IdentityServer belgelerindeki ASP.NET Çekirdek Kimliği Kullanma bölümüne bakın.

API kaynaklarını yapılandırma

API kaynaklarını AddInMemoryApiResources yapılandırırken yöntemi bir IEnumerable<ApiResource> koleksiyon bekler. Aşağıdaki kod örneği, GetApis eShop başvuru uygulamasında bu koleksiyonu sağlayan yöntemi gösterir:

public static IEnumerable<ApiResource> GetApis()
{
    return new List<ApiResource>
    {
        new ApiScope("orders", "Orders Service"),
        new ApiScope("basket", "Basket Service"),
        new ApiScope("webhooks", "Webhooks registration Service"),
    };
}

Bu yöntem, IdentityServer'ın siparişleri ve sepet API'lerini koruması gerektiğini belirtir. Bu nedenle, bu API'lere çağrı yapılırken IdentityServer tarafından yönetilen erişim belirteçleri gerekir. Tür hakkında ApiResource daha fazla bilgi için IdentityServer belgelerindeki API Kaynağı'na bakın.

Kimlik kaynaklarını yapılandırma

Kimlik kaynaklarını AddInMemoryIdentityResources yapılandırırken yöntemi bir IEnumerable<IdentityResource> koleksiyon bekler. Kimlik kaynakları kullanıcı kimliği, ad veya e-posta adresi gibi verilerdir. Her kimlik kaynağının benzersiz bir adı vardır ve kullanıcıya ait kimlik belirtecine eklenecek rastgele talep türleri atanabilir. Aşağıdaki kod örneği, GetResources eShop başvuru uygulamasında bu koleksiyonu sağlayan yöntemi gösterir:

public static IEnumerable<IdentityResource> GetResources()
{
    return new List<IdentityResource>
    {
        new IdentityResources.OpenId(),
        new IdentityResources.Profile()
    };
}

OpenID Connect belirtimi bazı standart kimlik kaynaklarını belirtir. Minimum gereksinim, kullanıcılar için benzersiz bir kimlik yayma desteği sağlanmasıdır. Bu, kimlik kaynağının açığa çıkartılmasıyla IdentityResources.OpenId elde edilir.

Not

IdentityResources sınıfı OpenID Connect belirtiminde tanımlanan tüm kapsamları destekler (openid, e-posta, profil, telefon ve adres).

IdentityServer ayrıca özel kimlik kaynaklarının tanımlanmasını da destekler. Daha fazla bilgi için IdentityServer belgelerindeki Özel kimlik kaynaklarını tanımlama bölümüne bakın. IdentityResource türü hakkında daha fazla bilgi için IdentityServer belgelerindeki Kimlik Kaynağı'na bakın.

İstemcileri yapılandırma

İstemciler, IdentityServer'dan belirteç isteyebilen uygulamalardır. Genellikle, her istemci için aşağıdaki ayarların en az olarak tanımlanması gerekir:

  • Benzersiz bir istemci kimliği.
  • Belirteç hizmetiyle izin verilen etkileşimler (verme türü olarak bilinir).
  • Kimlik ve erişim belirteçlerinin gönderildiği konum (yeniden yönlendirme URI'si olarak bilinir).
  • İstemcinin erişimine izin verilen kaynakların listesi (kapsamlar olarak bilinir).

İstemcileri AddInMemoryClients yapılandırırken yöntemi bir IEnumerable<Client> koleksiyon bekler. Aşağıdaki kod örneği, eShop başvuru uygulamasında bu koleksiyonu sağlayan yöntemde GetClients eShop çok platformlu uygulamasının yapılandırmasını gösterir:

public static IEnumerable<Client> GetClients(Dictionary<string,string> clientsUrl)
{
    return new List<Client>
    {
        // Omitted for brevity
        new Client
        {
            ClientId = "maui",
            ClientName = "eShop MAUI OpenId Client",
            AllowedGrantTypes = GrantTypes.Code,                    
            //Used to retrieve the access token on the back channel.
            ClientSecrets =
            {
                new Secret("secret".Sha256())
            },
            RedirectUris = { configuration["MauiCallback"] },
            RequireConsent = false,
            RequirePkce = true,
            PostLogoutRedirectUris = { $"{configuration["MauiCallback"]}/Account/Redirecting" },
            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                IdentityServerConstants.StandardScopes.OfflineAccess,
                "orders",
                "basket",
                "mobileshoppingagg",
                "webhooks"
            },
            //Allow requesting refresh tokens for long lived API access
            AllowOfflineAccess = true,
            AllowAccessTokensViaBrowser = true,
            AlwaysIncludeUserClaimsInIdToken = true,
            AccessTokenLifetime = 60 * 60 * 2, // 2 hours
            IdentityTokenLifetime = 60 * 60 * 2 // 2 hours
        }
    };
}

Bu yapılandırma aşağıdaki özellikler için verileri belirtir:

Özellik Açıklama
ClientId İstemci için benzersiz bir kimlik.
ClientName Günlüğe kaydetme ve onay ekranı için kullanılan istemci görünen adı.
AllowedGrantTypes İstemcinin IdentityServer ile nasıl etkileşime geçmek istediğini belirtir. Daha fazla bilgi için bkz . Kimlik doğrulama akışını yapılandırma.
ClientSecrets Belirteç uç noktasından belirteç istenirken kullanılan istemci gizli kimlik bilgilerini belirtir.
RedirectUris Belirteçlerin veya yetkilendirme kodlarının döndürüleceği izin verilen URI'leri belirtir.
RequireConsent Onay ekranının gerekli olup olmadığını belirtir.
RequirePkce Yetkilendirme kodu kullanan istemcilerin bir yazım denetleme anahtarı göndermesi gerekip gerekmediğini belirtir.
PostLogoutRedirectUris Oturumu kapatıldıktan sonra yeniden yönlendirilecek izin verilen URI'leri belirtir.
AllowedCorsOrigins IdentityServer'ın kaynaktan gelen çıkış noktaları arası çağrılara izin verebilmesi için istemcinin kaynağını belirtir.
AllowedScopes İstemcinin erişimi olan kaynakları belirtir. Varsayılan olarak, istemcinin hiçbir kaynağa erişimi yoktur.
AllowOfflineAccess İstemcinin yenileme belirteçleri isteyip isteyemeyeceğini belirtir.
AllowAccessTokensViaBrowser İstemcinin tarayıcı penceresinden erişim belirteçleri alıp alamayacağını belirtir.
AlwaysIncludeUserClaimsInIdToken Kullanıcı taleplerinin her zaman kimlik belirtecine ekleneceğini belirtir. Varsayılan olarak, bunların uç nokta kullanılarak userinfo alınması gerekir.
AccessTokenLifetime Erişim belirtecinin ömrünü saniye olarak belirtir.
IdentityTokenLifetime Kimlik belirtecinin ömrünü saniye olarak belirtir.

Kimlik doğrulama akışını yapılandırma

İstemci ile IdentityServer arasındaki kimlik doğrulama akışı, özelliğindeki Client.AllowedGrantTypes izin türleri belirtilerek yapılandırılabilir. OpenID Connect ve OAuth 2.0 belirtimleri aşağıdakiler gibi çeşitli kimlik doğrulama akışlarını tanımlar:

Kimlik Doğrulama Akışı Açıklama
Örtük Bu akış tarayıcı tabanlı uygulamalar için iyileştirilmiştir ve yalnızca kullanıcı kimlik doğrulaması veya kimlik doğrulaması ve erişim belirteci istekleri için kullanılmalıdır. Tüm belirteçler tarayıcı üzerinden iletilir ve bu nedenle yenileme belirteçleri gibi gelişmiş özelliklere izin verilmez.
Yetki kodu Bu akış, tarayıcı ön kanalı yerine arka kanaldaki belirteçleri alma olanağı sağlarken istemci kimlik doğrulamasını da destekler.
Hibrit Bu akış, örtük ve yetkilendirme kodu verme türlerinin bir bileşimidir. Kimlik belirteci tarayıcı kanalı üzerinden iletilir ve imzalı protokol yanıtını ve yetkilendirme kodu gibi diğer yapıtları içerir. Yanıt başarıyla doğruladıktan sonra, erişim ve yenileme belirtecini almak için arka kanal kullanılmalıdır.

İpucu

Karma kimlik doğrulama akışını kullanmayı göz önünde bulundurun. Karma kimlik doğrulama akışı, tarayıcı kanalına uygulanan bir dizi saldırıyı azaltır ve erişim belirteçlerini (ve muhtemelen belirteçleri yenilemek) isteyen yerel uygulamalar için önerilen akıştır.

Kimlik doğrulama akışları hakkında daha fazla bilgi için IdentityServer belgelerindeki Tür Verme bölümüne bakın.

Kimlik doğrulaması gerçekleştirme

IdentityServer'ın bir kullanıcı adına belirteçler vermesi için kullanıcının IdentityServer'da oturum açması gerekir. Ancak, IdentityServer kimlik doğrulaması için bir kullanıcı arabirimi veya veritabanı sağlamaz. Bu nedenle eShop başvuru uygulamasında bu amaçla ASP.NET Çekirdek Kimlik kullanılmaktadır.

eShop çok platformlu uygulama, aşağıdaki diyagramda gösterilen karma kimlik doğrulama akışıyla IdentityServer ile kimlik doğrulaması yapar.

Oturum açma işlemine üst düzey genel bakış.

adresine bir oturum açma isteği yapılır <base endpoint>:5105/connect/authorize. Kimlik doğrulaması başarılı bir şekilde tamamlandıktan sonra IdentityServer, yetkilendirme kodu ve kimlik belirteci içeren bir kimlik doğrulama yanıtı döndürür. Yetkilendirme kodu erişim, kimlik ve yenileme belirteçleriyle yanıt veren adresine gönderilir <base endpoint>:5105/connect/token.

eShop çok platformlu uygulaması, ek parametrelerle adresine istek <base endpoint>:5105/connect/endsession göndererek IdentityServer oturumunu kapatıyor. Oturum kapatıldıktan sonra IdentityServer, oturum kapatma sonrası yeniden yönlendirme URI'sini çok platformlu uygulamaya göndererek yanıt verir. Aşağıdaki diyagramda bu işlem gösterilmektedir.

Oturumu kapatma işlemine üst düzey genel bakış.

eShop çok platformlu uygulamasında IdentityServer ile iletişim, arabirimini uygulayan IdentityService sınıf tarafından IIdentityService gerçekleştirilir. Bu arabirim, uygulayan sınıfın , SignInAsyncSignOutAsync ve GetUserInfoAsync yöntemleri sağlaması GetAuthTokenAsyncgerektiğini belirtir.

Oturum açma

Kullanıcı üzerindeki LOGINLoginViewdüğmesine dokunduğundaSignInCommand, sınıfındaki LoginViewModel öğesi yürütülür ve bu da yöntemini yürütürSignInAsync. Aşağıdaki kod örneği bu yöntemi gösterir:

[RelayCommand]
private async Task SignInAsync()
{
    await IsBusyFor(
        async () =>
        {
            var loginSuccess = await _appEnvironmentService.IdentityService.SignInAsync();

            if (loginSuccess)
            {
                await NavigationService.NavigateToAsync("//Main/Catalog");
            }
        });
}

Bu yöntem, aşağıdaki kod örneğinde SignInAsync gösterildiği gibi sınıfında yöntemini çağırırIdentityService:

public async Task<bool> SignInAsync()
{
    var response = await GetClient().LoginAsync(new LoginRequest()).ConfigureAwait(false);

    if (response.IsError)
    {
        return false;
    }

    await _settingsService
        .SetUserTokenAsync(
            new UserToken
            {
                AccessToken = response.AccessToken,
                IdToken = response.IdentityToken,
                RefreshToken = response.RefreshToken,
                ExpiresAt = response.AccessTokenExpiration
            })
        .ConfigureAwait(false);

    return !response.IsError;
}

, IdentityService NuGet paketiyle sağlanan öğesini OidcClient kullanırIdentityModel.OidcClient. Bu istemci, kimlik doğrulama web görünümünü uygulamadaki kullanıcıya görüntüler ve kimlik doğrulama sonucunu yakalar. İstemci, gerekli parametrelerle IdentityServer'ın yetkilendirme uç noktasının URI'sine bağlanır. Yetkilendirme uç noktası, kullanıcı ayarı olarak kullanıma sunulan temel uç noktanın 5105 numaralı bağlantı noktasındadır /connect/authorize . Kullanıcı ayarları hakkında daha fazla bilgi için bkz . Yapılandırma Yönetimi.

Not

EShop çoklu platform uygulamasının saldırı yüzeyi, OAuth'a Kod Değişimi için Proof Key (PKCE) uzantısı uygulanarak azaltılır. PKCE, ele geçirilirse yetkilendirme kodunun kullanılmasını engeller. Bu, istemcinin bir gizli dizi doğrulayıcı oluşturması, bir karması yetkilendirme isteğinde geçirilir ve yetkilendirme kodu kullanıldığında bu karmanın karşılanmamış olarak sunulmasıyla elde edilir. PKCE hakkında daha fazla bilgi için bkz . Internet Engineering Task Force web sitesindeki OAuth Ortak İstemcileri Tarafından Kod Değişimi için Yazım Denetleme Anahtarı.

WebView tarafından görüntülenen oturum açma sayfası.

Belirteç uç noktası geçerli kimlik doğrulama bilgileri, yetkilendirme kodu ve PKCE gizli dizi doğrulayıcısı alırsa erişim belirteci, kimlik belirteci ve yenileme belirteci ile yanıt verir. Erişim belirteci (API kaynaklarına erişime izin verir) ve kimlik belirteci uygulama ayarları olarak depolanır ve sayfa gezintisi gerçekleştirilir. Bu nedenle, eShop çok platformlu uygulamasındaki genel etki şudur: Kullanıcıların IdentityServer ile başarılı bir şekilde kimlik doğrulaması yapabilmeleri koşuluyla, //Main/Catalog öğesini seçili sekmesi olarak görüntüleyen rotaya TabbedPageCatalogView yönlendirilirler.

Sayfa gezintisi hakkında bilgi için bkz . Gezinti. WebView gezintisi bir görünüm modeli yönteminin yürütülmesine nasıl neden olduğu hakkında bilgi için bkz . Davranışları kullanarak gezintiyi çağırma. Uygulama ayarları hakkında bilgi için bkz . Yapılandırma yönetimi.

Not

eShop, uygulama içinde SettingsViewsahte hizmetleri kullanacak şekilde yapılandırıldığında sahte oturum açmaya da izin verir. Bu modda uygulama IdentityServer ile iletişim kurmaz, bunun yerine kullanıcının herhangi bir kimlik bilgilerini kullanarak oturum açmasına izin verir.

Oturumu kapatma

Kullanıcı içindeki düğmesine dokunduğunda LOG OUTProfileViewLogoutCommand, sınıfındaki ProfileViewModel yöntemi yürüten LogoutAsync yürütülür. Bu yöntem, olarak ayarlanmış bir LoginView sorgu parametresi geçirerek sayfaya Logout sayfa gezintisi truegerçekleştirir.

Bu parametre yönteminde ApplyQueryAttributes değerlendirilir. Logout parametresi bir true değerle varsa, PerformLogoutAsync aşağıdaki kod örneğinde gösterilen sınıfın LoginViewModel yöntemi yürütülür:

private async Task PerformLogoutAsync()
{
    await _appEnvironmentService.IdentityService.SignOutAsync();

    _settingsService.UseFakeLocation = false;

    UserName.Value = string.Empty;
    Password.Value = string.Empty;
}

Bu yöntem, kullanıcı oturumunu SignOutAsyncIdentityService sonlandırmak için öğesini çağıran OidcClient ve kaydedilen tüm kullanıcı belirteçlerini temizleyen sınıfında yöntemini çağırır. Uygulama ayarları hakkında daha fazla bilgi için bkz . Yapılandırma yönetimi. Aşağıdaki kod örneği yöntemini gösterir SignOutAsync :

public async Task<bool> SignOutAsync()
{
    var response = await GetClient().LogoutAsync(new LogoutRequest()).ConfigureAwait(false);

    if (response.IsError)
    {
        return false;
    }

    await _settingsService.SetUserTokenAsync(default);

    return !response.IsError;
}

Bu yöntem, URI'yi gerekli parametrelerle IdentityServer'ın OidcClient çağırmak için kullanır. Son oturum uç noktası, kullanıcı ayarı olarak sunulan temel uç noktanın 5105 numaralı bağlantı noktasındadır /connect/endsession . Kullanıcı başarıyla oturumu kapatıldıktan sonra kullanıcıya LoginView sunulur ve kaydedilen tüm kullanıcı bilgileri temizlenir.

Sayfa gezintisi hakkında bilgi için bkz . Gezinti. Gezintinin bir görünüm modeli yönteminin yürütülmesine nasıl WebView neden olduğu hakkında bilgi için bkz . Davranışları kullanarak gezintiyi çağırma. Uygulama ayarları hakkında bilgi için bkz . Yapılandırma yönetimi.

Not

eShop, uygulama içinde sahte hizmetleri kullanacak şekilde yapılandırıldığında sahte oturum kapatmaya SettingsViewda izin verir. Bu modda, uygulama IdentityServer ile iletişim kurmaz ve bunun yerine uygulama ayarlarından depolanan belirteçleri temizler.

Yetkilendirme

Kimlik doğrulamasının ardından, ASP.NET Core web API'lerinin genellikle erişimi yetkilendirmesi gerekir ve bu da hizmetin API'leri bazı kimliği doğrulanmış kullanıcılar için kullanılabilir hale getirmesine izin verir, ancak tümü için kullanılamaz.

ASP.NET Core yoluna erişimi kısıtlamak, aşağıdaki kod örneğinde gösterildiği gibi denetleyiciye veya eyleme erişimi kimliği doğrulanmış kullanıcılarla sınırlayan bir Denetleyiciye veya eyleme Yetkilendir özniteliği uygulanarak elde edilebilir:

[Authorize]
public sealed class BasketController : Controller
{
    // Omitted for brevity
}

Yetkisiz bir kullanıcı Authorize özniteliğiyle işaretlenmiş bir denetleyiciye veya eyleme erişmeye çalışırsa, API çerçevesi bir 401 (unauthorized) HTTP durum kodu döndürür.

Not

Bir API'yi belirli kullanıcılarla kısıtlamak için Authorize özniteliğinde parametreler belirtilebilir. Daha fazla bilgi için bkz . ASP.NET Temel Belgeler: Yetkilendirme.

IdentityServer, erişim belirteçlerinin denetim yetkilendirmesi sağlaması için yetkilendirme iş akışıyla tümleştirilebilir. Bu yaklaşım aşağıdaki diyagramda gösterilmiştir.

Erişim belirteciyle yetkilendirme.

eShop çok platformlu uygulaması, kimlik mikro hizmetiyle iletişim kurar ve kimlik doğrulama işleminin bir parçası olarak bir erişim belirteci istemektedir. Daha sonra erişim belirteci, erişim isteklerinin bir parçası olarak sipariş ve sepet mikro hizmetleri tarafından kullanıma sunulan API'lere iletilir. Erişim belirteçleri, istemci ve kullanıcı hakkında bilgi içerir. API'ler daha sonra verilerine erişim yetkisi vermek için bu bilgileri kullanır. API'leri korumak için IdentityServer'ı yapılandırma hakkında bilgi için bkz . API kaynaklarını yapılandırma.

Yetkilendirme gerçekleştirmek için IdentityServer'ı yapılandırma

IdentityServer ile yetkilendirme gerçekleştirmek için yetkilendirme ara yazılımının web uygulamasının HTTP istek işlem hattına eklenmesi gerekir. Ara yazılım, sınıfındaki AddDefaultAuthentication yönteminden AddApplicationServices çağrılan ve eShop başvuru uygulamasından aşağıdaki kod örneğinde gösterilen uzantı yöntemine Program eklenir:

public static IServiceCollection AddDefaultAuthentication(this IHostApplicationBuilder builder)
{
    var services = builder.Services;
    var configuration = builder.Configuration;

    var identitySection = configuration.GetSection("Identity");

    if (!identitySection.Exists())
    {
        // No identity section, so no authentication
        return services;
    }

    // prevent from mapping "sub" claim to nameidentifier.
    JsonWebTokenHandler.DefaultInboundClaimTypeMap.Remove("sub");

    services.AddAuthentication().AddJwtBearer(options =>
    {
        var identityUrl = identitySection.GetRequiredValue("Url");
        var audience = identitySection.GetRequiredValue("Audience");

        options.Authority = identityUrl;
        options.RequireHttpsMetadata = false;
        options.Audience = audience;
        options.TokenValidationParameters.ValidIssuers = [identityUrl];
        options.TokenValidationParameters.ValidateAudience = false;
    });

    services.AddAuthorization();

    return services;
}

Bu yöntem, API'ye yalnızca geçerli bir erişim belirteci ile erişilmesini sağlar. Ara yazılım, güvenilir bir verenden gönderildiğinden emin olmak için gelen belirteci doğrular ve belirtecin bunu alan API ile kullanılmak üzere geçerli olduğunu doğrular. Bu nedenle, sıralama veya sepet denetleyicisine göz atmak, erişim belirtecinin gerekli olduğunu belirten bir 401 (unauthorized) HTTP durum kodu döndürür.

API'lere erişim isteklerinde bulunma

Sipariş ve sepet mikro hizmetleri için istekte bulunurken, kimlik doğrulama işlemi sırasında IdentityServer'dan alınan erişim belirteci, aşağıdaki kod örneğinde gösterildiği gibi isteğe dahil edilmelidir:

public async Task CreateOrderAsync(Models.Orders.Order newOrder)
{
    var authToken = await _identityService.GetAuthTokenAsync().ConfigureAwait(false);

    if (string.IsNullOrEmpty(authToken))
    {
        return;
    }

    var uri = $"{UriHelper.CombineUri(_settingsService.GatewayOrdersEndpointBase, ApiUrlBase)}?api-version=1.0";

    var success = await _requestProvider.PostAsync(uri, newOrder, authToken, "x-requestid").ConfigureAwait(false);
}

Erişim belirteci uygulamayla birlikte IIdentityService depolanır ve yöntemi kullanılarak GetAuthTokenAsync alınabilir.

Benzer şekilde, erişim belirteci aşağıdaki kod örneğinde gösterildiği gibi IdentityServer korumalı API'ye veri gönderirken eklenmelidir:

public async Task ClearBasketAsync()
{
    var authToken = await _identityService.GetAuthTokenAsync().ConfigureAwait(false);

    if (string.IsNullOrEmpty(authToken))
    {
        return;
    }

    await GetBasketClient().DeleteBasketAsync(new DeleteBasketRequest(), CreateAuthenticationHeaders(authToken))
        .ConfigureAwait(false);
}

Erişim belirteci öğesinden IIdentityService alınır ve sınıfındaki yöntemine ClearBasketAsync yapılan çağrıya BasketService dahil edilir.

RequestProvider eShop çok platformlu uygulamasındaki sınıfı, eShop başvuru uygulaması tarafından kullanıma sunulan RESTful API'lerine istekte bulunmak için sınıfını kullanırHttpClient. Yetkilendirme gerektiren sıralama ve sepet API'lerine istekte bulunurken, isteğe geçerli bir erişim belirteci eklenmelidir. Bu, erişim belirtecini aşağıdaki kod örneğinde gösterildiği gibi HttpClient örneğinin üst bilgilerine ekleyerek elde edilir:

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

DefaultRequestHeaders sınıfının özelliğiHttpClient, her istekle birlikte gönderilen üst bilgileri kullanıma sunar ve erişim belirteci dizesiyle Authorizationönekli üst bilgisine Bearer eklenir. İstek bir RESTful API'sine gönderildiğinde, üst bilginin değeri Authorization ayıklanır ve doğrulanır ve güvenilir bir verenden gönderildiğinden emin olur ve kullanıcının bunu alan API'yi çağırma izni olup olmadığını belirlemek için kullanılır.

eShop çok platformlu uygulamanın web isteklerinde nasıl olduğu hakkında daha fazla bilgi için bkz . Uzak verilere erişme.

Özet

Kimlik doğrulaması ve yetkilendirmeyi bir ASP.NET web uygulamasıyla iletişim kuran bir .NET MAUI uygulamasıyla tümleştirmeye yönelik birçok yaklaşım vardır. eShop çok platformlu uygulaması, IdentityServer kullanan kapsayıcılı bir kimlik mikro hizmetiyle kimlik doğrulaması ve yetkilendirme gerçekleştirir. IdentityServer, taşıyıcı belirteç kimlik doğrulaması gerçekleştirmek için ASP.NET Core Identity ile tümleşen ASP.NET Core için açık kaynaklı bir OpenID Connect ve OAuth 2.0 çerçevesidir.

Çok platformlu uygulama, bir kullanıcının kimliğini doğrulamak veya bir kaynağa erişmek için IdentityServer'dan güvenlik belirteçleri ister. Bir kaynağa erişirken, yetkilendirme gerektiren API'lere yönelik isteğe bir erişim belirteci eklenmelidir. IdentityServer'ın ara yazılımı, güvenilir bir verenden gönderildiklerinden ve bunları alan API ile kullanılmak için geçerli olduklarından emin olmak için gelen erişim belirteçlerini doğrular.