.NET Framework'te MSAL.NET'i Microsoft.Identity.Web ile tümleştirin.

Bu kılavuz, .NET Framework, .NET Standard 2.0 ve klasik .NET uygulamalarında (.NET 4.7.2+) MSAL.NET ile Microsoft.Identity.Web belirteç önbelleği ve sertifika paketlerinin nasıl kullanılacağını göstermektedir.

Genel bakışı anlama

Microsoft.Identity.Web 1.17+'dan itibaren, Microsoft.Identity.Web yardımcı paketlerini ASP.NET Core olmayan ortamlarda MSAL.NET ile kullanabilirsiniz.

Paket avantajlarını belirleme

Özellik Fayda
Belirteç Önbelleği Serileştirme Bellek içi, SQL Server, Redis, Cosmos DB, PostgreSQL için yeniden kullanılabilir önbellek bağdaştırıcıları
Sertifika Yardımcıları KeyVault, dosya sistemi veya sertifika depolarından basitleştirilmiş sertifika yükleme
Talep Uzantıları ClaimsPrincipal manipülasyonu için yardımcı yöntemler
.NET Standart 2.0 .NET Framework 4.7.2+, .NET Core ve .NET 5+ ile uyumludur
En Düşük Bağımlılıklar ASP.NET Core bağımlılıkları olmayan hedeflenen paketler

Desteklenen senaryoları gözden geçirme

Aşağıdaki senaryolar hedeflenen yardımcı program paketleriyle desteklenir.

  • .NET Framework Konsol Uygulamaları (daemon senaryoları)
  • Desktop Applications (.NET Framework)
  • Worker Services (.NET Framework)
  • .NET Standard 2.0 Kitaplıkları (platformlar arası uyumluluk)
  • Non-web MSAL.NET uygulamaları

Uyarı

ASP.NET MVC/Web API uygulamaları için bkz. OWIN Integration.


Paketleri seçme

Senaryonuzla eşleşen paketi seçin.

MSAL.NET için temel paketleri tanımlama

Package Amaç Bağımlılıklar .NET Hedefi
Microsoft. Identity.Web.TokenCache Token önbelleği serileştiricileri, ClaimsPrincipal uzantılar Minimal .NET Standart 2.0
Microsoft. Identity.Web.Certificate Sertifika yükleme yardımcı programları Minimal .NET Standart 2.0

Paketleri yükleme

Paketleri projenize eklemek için aşağıdaki yöntemlerden birini kullanın.

Paket Yöneticisi Console:

# Token cache serialization
Install-Package Microsoft.Identity.Web.TokenCache

# Certificate management
Install-Package Microsoft.Identity.Web.Certificate

.NET CLI:

dotnet add package Microsoft.Identity.Web.TokenCache
dotnet add package Microsoft.Identity.Web.Certificate

Temel paket sınırlamalarını anlama

Çekirdek Microsoft.Identity.Web paketi, ASP.NET Core bağımlılıkları (Microsoft.AspNetCore.*) içerir:

  • ASP.NET Framework ile uyumsuz
  • Paket boyutunu gereksiz yere artırma
  • Bağımlılık çakışmaları oluşturma

.NET Framework ve .NET Standart senaryoları için hedeflenen paketleri kullanın.


Belirteç önbelleği serileştirmeyi yapılandırma

Token önbellek bağdaştırıcılarını anlamak

Microsoft. Identity.Web, MSAL.NET IConfidentialClientApplication ile sorunsuz çalışan belirteç önbellek bağdaştırıcıları sağlar.

Belirteç önbelleği ile gizli istemci oluşturma

Aşağıdaki örnek gizli bir istemci uygulaması oluşturur ve bellek içi belirteç önbelleği ekler.

using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders;

public class MsalAppBuilder
{
    private static IConfidentialClientApplication _app;

    public static IConfidentialClientApplication BuildConfidentialClientApplication()
    {
        if (_app == null)
        {
            string clientId = ConfigurationManager.AppSettings["AzureAd:ClientId"];
            string clientSecret = ConfigurationManager.AppSettings["AzureAd:ClientSecret"];
            string tenantId = ConfigurationManager.AppSettings["AzureAd:TenantId"];

            // Create the confidential client application
            _app = ConfidentialClientApplicationBuilder.Create(clientId)
                .WithClientSecret(clientSecret)
                .WithTenantId(tenantId)
                .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
                .Build();

            // Add token cache serialization (choose one option below)
            _app.AddInMemoryTokenCache();
        }

        return _app;
    }
}

Belirteç önbelleği seçeneklerini belirleme

Dağıtım senaryonuza en uygun önbellek sağlayıcısını seçin.

Bellek içi belirteç önbelleğini yapılandırma

Aşağıdaki örnek basit bir bellek içi önbellek ekler:

using Microsoft.Identity.Web.TokenCacheProviders;

_app.AddInMemoryTokenCache();

Bellekteki boyut sınırlarına sahip önbellek (Microsoft.Identity.Web 1.20+):

using Microsoft.Extensions.Caching.Memory;

_app.AddInMemoryTokenCache(services =>
{
    // Configure memory cache options
    services.Configure<MemoryCacheOptions>(options =>
    {
        options.SizeLimit = 5000000;  // 5 MB limit
    });
});

Özellikler:

  • Hızlı erişim
  • Dış bağımlılık yok
  • İşlemler arasında paylaşılmaz
  • Uygulama yeniden başlatmada kayboldu

Kullanım örneği: Tek örnekli konsol uygulamaları, masaüstü uygulamaları


Dağıtılmış bellek içi belirteç önbelleğini yapılandırma

Çok örnekli ortamlar için dağıtılmış bir bellek içi önbellek eklemek için aşağıdaki kodu kullanın:

_app.AddDistributedTokenCaches(services =>
{
    // Requires: Microsoft.Extensions.Caching.Memory (NuGet)
    services.AddDistributedMemoryCache();
});

Özellikler:

  • Uygulama örnekleri arasında paylaşılan
  • Yük dengeli senaryolar için daha iyi
  • Ek NuGet paketi gerektirir
  • Uygulama yeniden başlatmada hala kayıp

Kullanım örneği: Belirteç yeniden alımı kabul edilebilir olan çok örnekli hizmetler


SQL Server belirteci önbelleğini yapılandırma

Kalıcı, dağıtılmış bir SQL Server önbelleği eklemek için aşağıdaki kodu kullanın:

using Microsoft.Extensions.Caching.SqlServer;

_app.AddDistributedTokenCaches(services =>
{
    // Requires: Microsoft.Extensions.Caching.SqlServer (NuGet)
    services.AddDistributedSqlServerCache(options =>
    {
        options.ConnectionString = ConfigurationManager.ConnectionStrings["TokenCache"].ConnectionString;
        options.SchemaName = "dbo";
        options.TableName = "TokenCache";

        // IMPORTANT: Set expiration above token lifetime
        // Access tokens typically expire after 1 hour
        options.DefaultSlidingExpiration = TimeSpan.FromMinutes(90);
    });
});

Gerekli önbellek tablosunu oluşturmak için aşağıdaki SQL'i çalıştırın:

-- Create the cache table
CREATE TABLE [dbo].[TokenCache] (
    [Id] NVARCHAR(449) NOT NULL,
    [Value] VARBINARY(MAX) NOT NULL,
    [ExpiresAtTime] DATETIMEOFFSET NOT NULL,
    [SlidingExpirationInSeconds] BIGINT NULL,
    [AbsoluteExpiration] DATETIMEOFFSET NULL,
    PRIMARY KEY ([Id])
);

-- Create index for performance
CREATE INDEX [Index_ExpiresAtTime] ON [dbo].[TokenCache] ([ExpiresAtTime]);

Özellikler:

  • Yeniden başlatmalar sonrasında kalıcı
  • Birden çok örnek arasında paylaşıldı
  • Güvenilir ve ölçeklenebilir
  • SQL Server kurulumu gerektirir

Kullanım örneği: Üretim daemon hizmetleri, zamanlanmış görevler, çok örnekli çalışanlar


Redis belirteci önbelleğini yapılandırma

Yüksek performanslı redis dağıtılmış önbelleği eklemek için aşağıdaki kodu kullanın:

using StackExchange.Redis;
using Microsoft.Extensions.Caching.StackExchangeRedis;

_app.AddDistributedTokenCaches(services =>
{
    // Requires: Microsoft.Extensions.Caching.StackExchangeRedis (NuGet)
    services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = ConfigurationManager.AppSettings["Redis:ConnectionString"];
        options.InstanceName = "TokenCache_";
    });
});

Aşağıdaki örnekte üretime hazır bir Redis yapılandırması gösterilmektedir:

services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = ConfigurationManager.AppSettings["Redis:ConnectionString"];
    options.InstanceName = "MyDaemonApp_";

    // Optional: Configure Redis options
    options.ConfigurationOptions = new ConfigurationOptions
    {
        AbortOnConnectFail = false,
        ConnectTimeout = 5000,
        SyncTimeout = 5000
    };
});

Özellikler:

  • Son derece hızlı
  • Örnekler arasında paylaşılan
  • Kalıcı (Redis kalıcılığı etkinken)
  • Redis sunucusu gerektirir

Kullanım örneği: Yüksek hacimli daemon uygulamaları, dağıtılmış sistemler, mikro hizmetler


Cosmos DB belirteç önbelleğini yapılandırma

Genel olarak dağıtılmış bir Cosmos DB önbelleği eklemek için aşağıdaki kodu kullanın:

using Microsoft.Extensions.Caching.Cosmos;

_app.AddDistributedTokenCaches(services =>
{
    // Requires: Microsoft.Extensions.Caching.Cosmos (preview)
    services.AddCosmosCache(options =>
    {
        options.ContainerName = "TokenCache";
        options.DatabaseName = "IdentityCache";
        options.ClientBuilder = new CosmosClientBuilder(
            ConfigurationManager.AppSettings["CosmosConnectionString"]);
        options.CreateIfNotExists = true;
    });
});

Özellikler:

  • Genel olarak dağıtılmış
  • Yüksek oranda kullanılabilir
  • Otomatik ölçeklendirme
  • Redis'ten daha yüksek gecikme süresi
  • Daha yüksek maliyet

Kullanım örneği: Küresel daemon hizmetleri, coğrafi olarak dağıtılmış uygulamalar


PostgreSQL belirteç önbelleğini yapılandırma

Dağıtılmış postgreSQL önbelleği eklemek için aşağıdaki kodu kullanın:

_app.AddDistributedTokenCaches(services =>
{
    // Requires: Microsoft.Extensions.Caching.Postgres (NuGet)
    services.AddDistributedPostgresCache(options =>
    {
        options.ConnectionString = ConfigurationManager.ConnectionStrings["PostgresCache"].ConnectionString;
        options.SchemaName = ConfigurationManager.AppSettings["PostgresCache:SchemaName"];
        options.TableName = ConfigurationManager.AppSettings["PostgresCache:TableName"];
        options.CreateIfNotExists = bool.Parse(
            ConfigurationManager.AppSettings["PostgresCache:CreateIfNotExists"] ?? "true");

        // Set expiration above token lifetime.
        // Access tokens typically expire after 1 hour.
        options.DefaultSlidingExpiration = TimeSpan.FromMinutes(90);
    });
});

Özellikler:

  • Yeniden başlatmalar sonrasında kalıcı
  • Birden çok örnek arasında paylaşıldı
  • Tanıdık SQL semantiği
  • PostgreSQL için Azure Veri Tabanı ile çalışır
  • PostgreSQL sunucusu gerektirir

Kullanım durumu: Birincil veritabanı olarak zaten PostgreSQL kullanan uygulamalar veya PostgreSQL için Azure Veri Tabanı kullanan Azure barındırma hizmetleri


Eksiksiz bir daemon uygulaması oluşturma

Aşağıdaki örnekte, istemci kimlik bilgilerini ve SQL Server belirteç önbelleğini kullanarak belirteçleri alan tam bir daemon uygulaması gösterilmektedir.

using Microsoft.Identity.Client;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders;
using System;
using System.Threading.Tasks;

namespace DaemonApp
{
    class Program
    {
        private static IConfidentialClientApplication _app;

        static async Task Main(string[] args)
        {
            // Build confidential client with token cache
            _app = BuildConfidentialClient();

            // Acquire token for app-only access
            string[] scopes = new[] { "https://graph.microsoft.com/.default" };

            try
            {
                var result = await _app.AcquireTokenForClient(scopes)
                    .ExecuteAsync();

                Console.WriteLine($"Token acquired successfully!");
                Console.WriteLine($"Token source: {result.AuthenticationResultMetadata.TokenSource}");
                Console.WriteLine($"Expires on: {result.ExpiresOn}");

                // Use token to call API
                await CallProtectedApi(result.AccessToken);
            }
            catch (MsalServiceException ex)
            {
                Console.WriteLine($"Error acquiring token: {ex.ErrorCode}");
                Console.WriteLine($"CorrelationId: {ex.CorrelationId}");
            }
        }

        private static IConfidentialClientApplication BuildConfidentialClient()
        {
            var app = ConfidentialClientApplicationBuilder
                .Create(ConfigurationManager.AppSettings["ClientId"])
                .WithClientSecret(ConfigurationManager.AppSettings["ClientSecret"])
                .WithTenantId(ConfigurationManager.AppSettings["TenantId"])
                .Build();

            // Add SQL Server token cache for persistence
            app.AddDistributedTokenCaches(services =>
            {
                services.AddDistributedSqlServerCache(options =>
                {
                    options.ConnectionString = ConfigurationManager
                        .ConnectionStrings["TokenCache"].ConnectionString;
                    options.SchemaName = "dbo";
                    options.TableName = "TokenCache";
                    options.DefaultSlidingExpiration = TimeSpan.FromMinutes(90);
                });
            });

            return app;
        }

        private static async Task CallProtectedApi(string accessToken)
        {
            // Your API call logic
        }
    }
}

Sertifikaları yönetme

Sertifika yüklemeyi anlama

Microsoft. Identity.Web, istemci kimlik bilgisi akışları için çeşitli kaynaklardan sertifika yüklemeyi basitleştirir.

DefaultCertificateLoader ile sertifikaları yükleme

Aşağıdaki örnekte, Azure Key Vault'dan sertifika yükleme ve gizli istemci uygulaması oluşturma işlemleri gösterilmektedir.

using Microsoft.Identity.Web;
using Microsoft.Identity.Client;

public class CertificateHelper
{
    public static IConfidentialClientApplication CreateAppWithCertificate()
    {
        string clientId = ConfigurationManager.AppSettings["AzureAd:ClientId"];
        string tenantId = ConfigurationManager.AppSettings["AzureAd:TenantId"];

        // Define certificate source
        var certDescription = CertificateDescription.FromKeyVault(
            keyVaultUrl: "https://my-keyvault.vault.azure.net",
            keyVaultCertificateName: "MyCertificate"
        );

        // Load certificate
        ICertificateLoader certificateLoader = new DefaultCertificateLoader();
        certificateLoader.LoadIfNeeded(certDescription);

        // Create confidential client with certificate
        var app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithCertificate(certDescription.Certificate)
            .WithTenantId(tenantId)
            .Build();

        // Add token cache
        app.AddInMemoryTokenCache();

        return app;
    }
}

Sertifika kaynaklarını seçme

Azure Key Vault'dan yükleme

Kasa URL'sini ve sertifika adını belirterek Azure Key Vault'de depolanan bir sertifikayı yükleyin.

var certDescription = CertificateDescription.FromKeyVault(
    keyVaultUrl: "https://my-keyvault.vault.azure.net",
    keyVaultCertificateName: "MyApplicationCert"
);

ICertificateLoader loader = new DefaultCertificateLoader();
loader.LoadIfNeeded(certDescription);

var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithCertificate(certDescription.Certificate)
    .WithTenantId(tenantId)
    .Build();

Ön koşullar:

  • Key Vault erişimi olan Yönetilen Kimlik veya Hizmet Sorumlusu
  • Azure.Identity NuGet paketi
  • Key Vault izni: Get sertifikalar üzerinde

Sertifika deposundan yükleme

Windows sertifika deposundan ayırt edici ada göre bir sertifika yükleyin.

var certDescription = CertificateDescription.FromStoreWithDistinguishedName(
    distinguishedName: "CN=MyApp.contoso.com",
    storeName: StoreName.My,
    storeLocation: StoreLocation.CurrentUser
);

ICertificateLoader loader = new DefaultCertificateLoader();
loader.LoadIfNeeded(certDescription);

var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithCertificate(certDescription.Certificate)
    .WithTenantId(tenantId)
    .Build();

Sertifikayı parmak iziyle de bulabilirsiniz:

var certDescription = CertificateDescription.FromStoreWithThumbprint(
    thumbprint: "ABCDEF1234567890ABCDEF1234567890ABCDEF12",
    storeName: StoreName.My,
    storeLocation: StoreLocation.LocalMachine
);

Dosya sisteminden yükleme

Yerel dosya sistemindeki bir PFX dosyasından sertifika yükleyin.

var certDescription = CertificateDescription.FromPath(
    path: @"C:\Certificates\MyAppCert.pfx",
    password: ConfigurationManager.AppSettings["Certificate:Password"]
);

ICertificateLoader loader = new DefaultCertificateLoader();
loader.LoadIfNeeded(certDescription);

var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithCertificate(certDescription.Certificate)
    .WithTenantId(tenantId)
    .Build();

Güvenlik notu: Parolaları asla sabit kodlama. Güvenli yapılandırmayı kullanın.


Base64 ile kodlanmış dizeden yükleme

Yapılandırmada depolanan Base64 kodlu dizeden bir sertifika yükleyin.

string base64Cert = ConfigurationManager.AppSettings["Certificate:Base64"];

var certDescription = CertificateDescription.FromBase64Encoded(
    base64EncodedValue: base64Cert,
    password: ConfigurationManager.AppSettings["Certificate:Password"]  // Optional
);

ICertificateLoader loader = new DefaultCertificateLoader();
loader.LoadIfNeeded(certDescription);

App.config'dan sertifika yüklemeyi yapılandırma

App.config dosyanızda sertifika ayarlarını tanımlayın ve çalışma zamanında yükleyin.

App.config:

<appSettings>
  <add key="AzureAd:ClientId" value="your-client-id" />
  <add key="AzureAd:TenantId" value="your-tenant-id" />

  <!-- Option 1: KeyVault -->
  <add key="Certificate:SourceType" value="KeyVault" />
  <add key="Certificate:KeyVaultUrl" value="https://my-vault.vault.azure.net" />
  <add key="Certificate:KeyVaultCertificateName" value="MyCert" />

  <!-- Option 2: Store -->
  <!--
  <add key="Certificate:SourceType" value="StoreWithThumbprint" />
  <add key="Certificate:CertificateThumbprint" value="ABCD..." />
  <add key="Certificate:CertificateStorePath" value="CurrentUser/My" />
  -->
</appSettings>

<connectionStrings>
  <add name="TokenCache"
       connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TokenCache;Integrated Security=True;" />
</connectionStrings>

Sertifikayı yapılandırmaya göre yüklemek için aşağıdaki yardımcı yöntemi kullanın:

public static CertificateDescription GetCertificateFromConfig()
{
    string sourceType = ConfigurationManager.AppSettings["Certificate:SourceType"];

    return sourceType switch
    {
        "KeyVault" => CertificateDescription.FromKeyVault(
            ConfigurationManager.AppSettings["Certificate:KeyVaultUrl"],
            ConfigurationManager.AppSettings["Certificate:KeyVaultCertificateName"]
        ),

        "StoreWithThumbprint" => CertificateDescription.FromStoreWithThumbprint(
            ConfigurationManager.AppSettings["Certificate:CertificateThumbprint"],
            StoreName.My,
            StoreLocation.CurrentUser
        ),

        _ => throw new ConfigurationErrorsException("Invalid certificate source type")
    };
}

Örnek uygulamaları keşfetme

Çalışan uygulamaları görmek için bu örnekleri gözden geçirin.

Resmi Microsoft örneklerini gözden geçirin

Aşağıdaki tabloda belirteç önbelleğe alma ve sertifika yüklemeyi gösteren resmi örnekler listeleniyor.

Örnek Platform Açıklama
ConfidentialClientTokenCache Konsol (.NET Framework) Belirteç önbelleği serileştirme desenleri
active-directory-dotnetcore-daemon-v2 Konsol (.NET Core) Key Vault'dan sertifika yükleme

En iyi yöntemleri izleyin

Güvenilir ve güvenli uygulamalar oluşturmak için bu desenleri uygulayın.

1. IConfidentialClientApplication için tekil deseni kullanın:

Tek bir örnek oluşturun ve bunu uygulamanızda yeniden kullanabilirsiniz.

private static IConfidentialClientApplication _app;

public static IConfidentialClientApplication GetApp()
{
    if (_app == null)
    {
        _app = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithTenantId(tenantId)
            .Build();

        _app.AddDistributedTokenCaches(/* ... */);
    }

    return _app;
}

2. Uygun jeton önbelleği süre sonunu ayarlayın:

Gereksiz yeniden alımı önlemek için belirteç ömrünün ötesinde kayan zaman aşımını yapılandırın.

// Access tokens typically expire after 1 hour
// Set cache expiration ABOVE token lifetime
options.DefaultSlidingExpiration = TimeSpan.FromMinutes(90);

3. Güvenli sertifika depolama alanı kullanın:

Sertifikaları Azure Key Vault veya düzgün güvenli bir sertifika deposunda depolayın.

// Azure Key Vault (production)
var cert = CertificateDescription.FromKeyVault(keyVaultUrl, certName);

// Certificate store with proper permissions
var cert = CertificateDescription.FromStoreWithThumbprint(
    thumbprint, StoreName.My, StoreLocation.LocalMachine);

4. Uygun hata işlemeyi uygulayın:

MSAL özel durumlarını yakalayın ve sorun giderme için ilişkilendirme kimliğini kayıt altına alın.

try
{
    var result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
}
catch (MsalServiceException ex)
{
    logger.Error($"Token acquisition failed. CorrelationId: {ex.CorrelationId}, ErrorCode: {ex.ErrorCode}");
    throw;
}

5. Üretim için dağıtılmış önbellek kullanın:

Dağıtılmış önbellek, belirteçleri örnekler arasında paylaşır ve yeniden başlatmalarda kalıcı hale gelir.

// Correct for daemon services
app.AddDistributedTokenCaches(services =>
{
    services.AddDistributedSqlServerCache(/* ... */);
});

Yaygın hatalardan kaçının

1. Yeni IConfidentialClientApplication örneklerini tekrar tekrar oluşturmayın:

// Wrong - creates new instance every time
public void AcquireToken()
{
    var app = ConfidentialClientApplicationBuilder.Create(clientId).Build();
    // ...
}

// Correct - use singleton
private static readonly IConfidentialClientApplication _app = BuildApp();

2. Gizli dizileri sabit kodlamayın:

// Wrong
.WithClientSecret("supersecretvalue123")

// Correct
.WithClientSecret(ConfigurationManager.AppSettings["AzureAd:ClientSecret"])

3. Çok örnekli hizmetler için bellek içi önbellek kullanmayın:

// Wrong for services with multiple instances
app.AddInMemoryTokenCache();

// Correct - use distributed cache
app.AddDistributedTokenCaches(services =>
{
    services.AddDistributedSqlServerCache(/* ... */);
});

4. Sertifika doğrulamayı yoksaymayın:

// Wrong - skips validation
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;

// Correct - validate certificates properly

ADAL.NET'ten geçiş yapın

Önemli farkları gözden geçirin ve kodunuzu MSAL.NET'i Microsoft.Identity.Web ile kullanacak şekilde güncelleyin.

Önemli farkları anlama

Görünüş ADAL.NET (kullanım dışı) MSAL.NET + Microsoft. Identity.Web
Kapsamlar Kaynak tabanlı (https://graph.microsoft.com) Kapsam tabanlı (https://graph.microsoft.com/.default)
Belirteç Önbelleği El ile serileştirme gerekiyor Uzantı yöntemleri aracılığıyla yerleşik bağdaştırıcılar
Certificates El ile X509Certificate2 yüklemesi DefaultCertificateLoader birden çok kaynakla
Otorite Oluşturma sırasında sabitlenmiştir İstek başına geçersiz kılınabilir

Geçiş örneklerini karşılaştırma

ADAL.NET (Eski):

AuthenticationContext authContext = new AuthenticationContext(authority);
ClientCredential credential = new ClientCredential(clientId, clientSecret);
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, credential);

Microsoft.Identity.Web ile MSAL.NET (Yeni):

var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithClientSecret(clientSecret)
    .WithTenantId(tenantId)
    .Build();

app.AddInMemoryTokenCache();  // Add token cache

string[] scopes = new[] { "https://graph.microsoft.com/.default" };
AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync();

İlgili senaryolar hakkında daha fazla bilgi edinmek için bu kaynakları kullanın.