Aracılığıyla paylaş


SPA'lar için Web API arka ucunu güvence altına almak amacıyla Identity nasıl kullanılır?

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

ASP.NET Core Identity kimlik doğrulaması, yetkilendirme ve kimlik yönetimini işleyen API'ler sağlar. API'ler, tabanlı kimlik doğrulaması ile cookieWeb API'sinin arka uç noktalarının güvenliğini sağlamayı mümkün kılar. Tanımlama bilgilerini kullanamayan istemciler için belirteç tabanlı bir seçenek mevcuttur, ancak bu seçeneği kullanırken belirteçlerin güvenli tutulmasını sağlamak sizin sorumluluğunuzdadır. Tarayıcı tabanlı uygulamalar için tanımlama bilgileri kullanmanızı öneririz, çünkü tarayıcı bunları varsayılan olarak JavaScript'e göstermeden otomatik olarak yönetir.

Bu makalede Angular, React ve Vue uygulamaları gibi SPA'lar için bir Web API arka ucu güvenliğini sağlamak için nasıl kullanılacağı Identity gösterilmektedir. Uygulamaların güvenliğini Blazor WebAssemblysağlamak için aynı arka uç API'leri kullanılabilir.

Önkoşullar

Bu makalede gösterilen adımlar, aşağıdaki ASP.NET Core Web API'sine kimlik doğrulaması ve yetkilendirme ekler:

  • kimlik doğrulaması için henüz yapılandırılmamış.
  • veya üzeri net8.0 Hedefler.
  • En düşük API veya denetleyici tabanlı API olabilir.

Bu makaledeki test yönergelerinden bazıları, proje şablonuna dahil edilen Swagger kullanıcı arabirimini kullanır. Web API arka ucu ile Identity kullanmak için Swagger kullanıcı arabirimi gerekli değildir.

NuGet paketlerini yükleme

Aşağıdaki NuGet paketlerini yükleyin:

Başlamanın en hızlı yolu için bellek içi veritabanını kullanın.

Test veya üretim kullanımı sırasında oturumlar arasında kullanıcı verilerini kaydetmek için veritabanını daha sonra SQLite veya SQL Server olarak değiştirin. Bellek içiyle karşılaştırıldığında bu, başlangıç öğreticisinde gösterildiği gibi veritabanının geçişler aracılığıyla oluşturulmasını gerektirdiğinden biraz karmaşıklık getirir.

Visual Studio'da NuGet paket yöneticisini veya dotnet add package CLI komutunu kullanarak bu paketleri yükleyin.

Oluştur IdentityDbContext

ApplicationDbContext adlı ve IdentityDbContext<TUser> öğesinden devralan bir sınıf ekleyin.

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;

public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) :
        base(options)
    { }
}

Gösterilen kod, veritabanını farklı ortamlar için yapılandırmayı mümkün kılan özel bir oluşturucu sağlar.

Bu using adımlarda gösterilen kodu eklerken aşağıdaki yönergelerden birini veya daha fazlasını gerektiği gibi ekleyin.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

EF Core bağlamını yapılandırın

Daha önce belirtildiği gibi, kullanmaya başlamanın en basit yolu bellek içi veritabanını kullanmaktır. Bellek içi ile her çalıştırma yeni bir veritabanıyla başlar ve geçişleri kullanmaya gerek yoktur. Çağrıyı WebApplication.CreateBuilder(args) yaptıktan sonra, Identity'i bellek içi veritabanı kullanacak şekilde yapılandırmak için aşağıdaki kodu ekleyin.

builder.Services.AddDbContext<ApplicationDbContext>(
    options => options.UseInMemoryDatabase("AppDb"));

Test veya üretim kullanımı sırasında oturumlar arasında kullanıcı verilerini kaydetmek için veritabanını daha sonra SQLite veya SQL Server olarak değiştirin.

Kapsayıcıya Identity hizmetler ekle

WebApplication.CreateBuilder(args) çağrısından sonra AddAuthorization çağrısını yaparak bağımlılık enjeksiyonu (DI) kapsayıcısına hizmet ekleyin.

builder.Services.AddAuthorization();

API'leri etkinleştirme Identity

WebApplication.CreateBuilder(args) çağrısından sonra, AddIdentityApiEndpoints<TUser>(IServiceCollection) ve AddEntityFrameworkStores<TContext>(IdentityBuilder) çağrısını yapın.

builder.Services.AddIdentityApiEndpoints<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

Varsayılan olarak hem tanımlama bilgileri hem de özel belirteçler etkinleştirilir. Oturum açma sırasında tanımlama bilgileri ve belirteçler, oturum açma uç noktasındaki useCookies sorgu dizesi parametresi true ise verilir.

Rotaları haritalandır Identity

builder.Build() çağrısından sonra, MapIdentityApi<TUser>(IEndpointRouteBuilder) uç noktalarını eşlemek için Identity çağrısı yapılır:

app.MapIdentityApi<IdentityUser>();

Seçili uç noktaların güvenliğini sağlama

Bir uç noktanın RequireAuthorization güvenliğini sağlamak için, yolu tanımlayan çağrıda Map{Method} uzantı yöntemini kullanın. Örneğin:

app.MapGet("/weatherforecast", (HttpContext httpContext) =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = summaries[Random.Shared.Next(summaries.Length)]
        })
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi()
.RequireAuthorization();

yöntemi RequireAuthorization aşağıdakiler için de kullanılabilir:

  • Aşağıdaki örnekte gösterildiği gibi Swagger UI uç noktalarının güvenliğini sağlama:

    app.MapSwagger().RequireAuthorization();
    
  • Aşağıdaki örnekte gösterildiği gibi belirli bir talep veya izinle güvenlidir:

    .RequireAuthorization("Admin");
    

Denetleyici tabanlı bir web API projesinde, [Authorize] özniteliğini bir denetleyiciye veya eyleme uygulayarak uç noktaların güvenliğini sağlayın.

API’yi test etme

Kimlik doğrulamasını test etmenin hızlı bir yolu, bellek içi veritabanını ve proje şablonuna dahil edilen Swagger kullanıcı arabirimini kullanmaktır. Aşağıdaki adımlar, API'nin Swagger kullanıcı arabirimiyle nasıl test yapılacağını gösterir. Swagger UI uç noktalarının güvenli olmadığından emin olun.

Güvenli uç noktaya erişme girişimi

  • Uygulamayı çalıştırın ve Swagger kullanıcı arabirimine gidin.
  • Web API şablonu tarafından oluşturulan bir projede olduğu gibi /weatherforecast güvenli bir uç noktayı genişletin.
  • Deneyin'i seçin.
  • Yürüt'ü seçin. Yanıt: 401 - not authorized.

Test kaydı

  • Genişletin /register ve Deneyin'i seçin.

  • Kullanıcı arabiriminin Parametreler bölümünde örnek bir istek gövdesi gösterilir:

    {
      "email": "string",
      "password": "string"
    }
    
  • "Dize" yerine geçerli bir e-posta adresi ve parola yazın ve ardından Çalıştır'ı seçin.

    Varsayılan parola doğrulama kurallarına uymak için parola en az altı karakter uzunluğunda olmalı ve aşağıdaki karakterlerden en az birini içermelidir:

    • Büyük harf
    • Küçük harf
    • Sayısal rakam
    • Alfasayısal olmayan karakter

    Geçersiz bir e-posta adresi veya hatalı parola girerseniz sonuç doğrulama hatalarını içerir. Aşağıda doğrulama hataları içeren bir yanıt gövdesi örneği verilmişti:

    {
      "type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
      "title": "One or more validation errors occurred.",
      "status": 400,
      "errors": {
        "PasswordTooShort": [
          "Passwords must be at least 6 characters."
        ],
        "PasswordRequiresNonAlphanumeric": [
          "Passwords must have at least one non alphanumeric character."
        ],
        "PasswordRequiresDigit": [
          "Passwords must have at least one digit ('0'-'9')."
        ],
        "PasswordRequiresLower": [
          "Passwords must have at least one lowercase ('a'-'z')."
        ]
      }
    }
    

    Hatalar ProblemDetails biçiminde döndürülür, böylece istemci bunları ayrıştırabilir ve gerektiğinde doğrulama hatalarını görüntüleyebilir.

    Başarılı bir kayıt, bir 200 - OK yanıtı ile sonuçlanır.

Oturum açmayı test et

  • Genişlet /login ve Deneyin'i seçin. Örnek istek gövdesi, iki ek parametreyi gösterir:

    {
      "email": "string",
      "password": "string",
      "twoFactorCode": "string",
      "twoFactorRecoveryCode": "string"
    }
    

    Bu örnek için ek JSON özellikleri gerekli değildir ve silinebilir. useCookies seçeneğini true olarak ayarlayın.

  • "string" değerini, kaydetmek için kullandığınız e-posta adresi ve parolayla değiştirin ve ardından Yürüt'e tıklayın.

    Başarılı bir oturum açma işlemi, yanıt üst bilgisinde bulunan bir 200 - OKcookie yanıtla sonuçlanır.

Güvenli uç noktayı yeniden test etme

Başarılı bir oturum açma işleminin ardından güvenli uç noktayı yeniden çalıştırın. Kimlik doğrulaması cookie istekle birlikte otomatik olarak gönderilir ve uç nokta yetkilendirilmiştir. Cookietabanlı kimlik doğrulaması, tarayıcıda güvenli bir şekilde yerleşiktir ve "yalnızca çalışır."

Tarayıcı olmayan istemcilerle test etme

Varsayılan olarak bazı web istemcileri üst bilgiye tanımlama bilgilerini eklemeyebilir.

  • API'leri test etmek için bir araç kullanıyorsanız, ayarlarda çerezleri etkinleştirmeniz gerekebilir.

  • JavaScript fetch API'si varsayılan olarak çerezleri içermez. Seçeneklerde credentials'i include olarak ayarlayarak bunları etkinleştirin.

  • HttpClient bir Blazor WebAssembly uygulamasında çalışırken, HttpRequestMessage kimlik bilgilerini içermelidir, aşağıdaki örnekte olduğu gibi:

    request.SetBrowserRequestCredential(BrowserRequestCredentials.Include);
    

Belirteç tabanlı kimlik doğrulamayı kullanma

Tarayıcı tabanlı uygulamalarda tanımlama bilgilerinin kullanılmasını öneririz çünkü tarayıcı varsayılan olarak bunları JavaScript'e açığa çıkarmadan otomatik olarak işler.

Sonraki isteklerin kimliğini doğrulamak için kullanılabilecek özel bir belirteç (ASP.NET Core kimlik platformuna özel bir belirteç) verilir. Belirteç, Authorization üst bilgisinde bir taşıyıcı belirteç olarak geçirilir. Yenileme belirteci de sağlanır. Bu belirteç, kullanıcının yeniden oturum açmaya zorlamadan eskisinin süresi dolduğunda uygulamanın yeni bir belirteç istemesine olanak tanır.

Belirteçler standart JSON Web Belirteçleri (JWT) değildir. Yerleşik Identity API öncelikli olarak basit senaryolar için tasarlandığından özel belirteçlerin kullanımı kasıtlıdır. Belirteç seçeneğinin tam özellikli bir kimlik hizmeti sağlayıcısı veya belirteç sunucusu olması amaçlanmamıştır, bunun yerine tanımlama bilgilerini kullanamayan istemciler için cookie seçeneğine alternatiftir.

Belirteç tabanlı kimlik doğrulamasını useCookies kullanmak için, uç noktayı çağırırken sorgu dizesi parametresini false/login olarak ayarlayın. Jetonlar belirteç kimlik doğrulama şemasını kullanır. /login çağrısından döndürülen belirteci kullanarak, korumalı uç noktalara yapılan sonraki çağrılar, Authorization: Bearer <token> erişim belirteci olan headerı <token> eklemelidir. Daha fazla bilgi için bu makalenin devamında yer alan POST /login Uç noktayı kullanma bölümüne bakın.

Oturumu kapat

Kullanıcının oturumunu kapatması için imkan tanımak amacıyla aşağıdaki örneğe benzer bir /logout uç noktası tanımlayın.

app.MapPost("/logout", async (SignInManager<IdentityUser> signInManager,
    [FromBody] object empty) =>
{
    if (empty != null)
    {
        await signInManager.SignOutAsync();
        return Results.Ok();
    }
    return Results.Unauthorized();
})
.WithOpenApi()
.RequireAuthorization();

Bu uç nokta çağrılırken istek gövdesinde boş bir JSON nesnesi ({}) sağlayın. Aşağıdaki kod, oturumu kapatma uç noktasına yönelik bir çağrı örneğidir:

public signOut() {
  return this.http.post('/logout', {}, {
    withCredentials: true,
    observe: 'response',
    responseType: 'text'

MapIdentityApi<TUser> noktaları

MapIdentityApi<TUser> çağrısı aşağıdaki uç noktaları uygulamaya ekler.

POST /register uç noktasını kullan

İstek gövdesi, Email ve Password özelliklerine sahip olmalıdır.

{
  "email": "string",
  "password": "string",
}

Daha fazla bilgi için bkz.

POST /login uç noktasını kullan

İstek gövdesinde Email ve Password gereklidir. İki öğeli kimlik doğrulaması (2FA) etkinse TwoFactorCode veya TwoFactorRecoveryCode gereklidir. 2FA etkin değilse, hem twoFactorCode hem de twoFactorRecoveryCode atlayın. Daha fazla bilgi için bu makalenin devamında yer alan POST /manage/2fa Uç noktayı kullanma bölümüne bakın.

2FA'nın etkinleştirilmediği bir istek gövdesi örneği aşağıda verilmişti:

{
  "email": "string",
  "password": "string"
}

2FA'nın etkinleştirildiği istek gövdesi örnekleri aşağıda verilmiştir:

  • {
      "email": "string",
      "password": "string",
      "twoFactorCode": "string",
    }
    
  • {
      "email": "string",
      "password": "string",
      "twoFactorRecoveryCode": "string"
    }
    

Uç nokta bir sorgu dizesi parametresi bekler:

  • useCookies-Tabanlı kimlik doğrulaması için true olarak cookie ayarlanır. Belirteç tabanlı kimlik doğrulaması için false olarak ayarlayın veya çıkartın.

Tabanlı kimlik doğrulaması hakkında cookiedaha fazla bilgi için bu makalenin önceki bölümlerindeki Oturum açmayı test edin bölümüne bakın.

Belirteç tabanlı kimlik doğrulaması

useCookies false veya atlanırsa, belirteç tabanlı kimlik doğrulaması etkinleştirilir. Yanıt gövdesi aşağıdaki özellikleri içerir:

{
  "tokenType": "string",
  "accessToken": "string",
  "expiresIn": 0,
  "refreshToken": "string"
}

Bu özellikler hakkında daha fazla bilgi için bkz AccessTokenResponse. .

Aşağıdaki örnekte gösterildiği gibi kimliği doğrulanan istekler yapmak için erişim belirtecini bir başlık içerisine yerleştirin.

Authorization: Bearer {access token}

Erişim belirtecinin süresi dolmak üzereyken /refresh uç noktasını çağırın.

POST /refresh uç noktasını kullan

Yalnızca belirteç tabanlı kimlik doğrulaması ile kullanmak için. Kullanıcıyı yeniden oturum açmaya zorlamadan yeni bir erişim belirteci alır. Erişim belirtecinin süresi dolmak üzereyken bu uç noktayı çağırın.

İstek gövdesi yalnızca RefreshToken öğesini içerir. aşağıda bir istek gövdesi örneği verilmişti:

{
  "refreshToken": "string"
}

Çağrı başarılı olursa, yanıt gövdesi aşağıdaki örnekte gösterildiği gibi yeni bir AccessTokenResponse olur.

{
  "tokenType": "string",
  "accessToken": "string",
  "expiresIn": 0,
  "refreshToken": "string"
}

GET /confirmEmail uç noktasını kullan

Eğer Identity e-posta onayı için ayarlanmışsa, /register uç noktasına yapılan başarılı bir çağrı, /confirmEmail uç noktasına bağlantı içeren bir e-posta gönderir. Bağlantı aşağıdaki sorgu dizesi parametrelerini içerir:

  • userId
  • code
  • changedEmail - Yalnızca kullanıcı kayıt sırasında e-posta adresini değiştirdiyse eklenir.

Identity onay e-postası için varsayılan metin sağlar. Varsayılan olarak, e-posta konusu "E-postanızı onaylayın" şeklindedir ve e-posta gövdesi aşağıdaki örneğe benzer:

 Please confirm your account by <a href='https://contoso.com/confirmEmail?userId={user ID}&code={generated code}&changedEmail={new email address}'>clicking here</a>.

RequireConfirmedEmail özelliği olarak ayarlanırsatrue, kullanıcı e-postadaki bağlantıya tıklayarak e-posta adresi onaylanana kadar oturum açamaz. Son nokta /confirmEmail:

  • E-posta adresini onaylar ve kullanıcının oturum açmasını sağlar.
  • Yanıt gövdesinde "E-postanızı onayladığınız için teşekkür ederiz" metnini döndürür.

Identity için e-posta onayı ayarlamak amacıyla, Program.cs içine kod ekleyerek RequireConfirmedEmail'yi true olarak ayarlayın ve IEmailSender uygulayan bir sınıfı DI kapsayıcısına ekleyin. Örneğin:

builder.Services.Configure<IdentityOptions>(options =>
{
    options.SignIn.RequireConfirmedEmail = true;
});

builder.Services.AddTransient<IEmailSender, EmailSender>();

Daha fazla bilgi için bkz . ASP.NET Core'da hesap onayı ve parola kurtarma.

Identity , 2FA ve parola sıfırlama gibi gönderilmesi gereken diğer e-postalar için varsayılan metin sağlar. Bu e-postaları özelleştirmek için arabiriminin IEmailSender özel bir uygulamasını sağlayın. Yukarıdaki örnekte, EmailSender uygulayan bir sınıftır IEmailSender. Daha fazla bilgi için, IEmailSender uygulayan bir sınıf örneği de dahil olmak üzere, ASP.NET Core'da hesap onayı ve parola kurtarma konusuna bakabilirsiniz.

POST /resendConfirmationEmail uç noktasını kullan

Yalnızca adres kayıtlı bir kullanıcı için geçerliyse e-posta gönderir.

İstek gövdesi yalnızca Email öğesini içerir. aşağıda bir istek gövdesi örneği verilmişti:

{
  "email": "string"
}

Daha fazla bilgi için bu makalenin önceki bölümlerinde yer alan GET /confirmEmail Uç noktayı kullanma bölümüne bakın.

POST /forgotPassword uç noktasını kullan

Parola sıfırlama kodu içeren bir e-posta oluşturur. Bu kodu yeni bir parolayla adresine /resetPassword gönderin.

İstek gövdesi yalnızca Email öğesini içerir. Bir örnek aşağıda verilmiştir:

{
  "email": "string"
}

E-posta gönderimini etkinleştirmeyi nasıl yapacağınız hakkında bilgi için uç noktasını kullanma konusuna bakın.

POST /resetPassword uç noktasını kullan

Sıfırlama kodunu almak için /forgotPassword uç noktasını çağırdıktan sonra bu uç noktayı çağırın.

İstek gövdesi için Email, ResetCode ve NewPassword gerektirir. Bir örnek aşağıda verilmiştir:

{
  "email": "string",
  "resetCode": "string",
  "newPassword": "string"
}

POST /manage/2fa uç noktasını kullan

Kullanıcı için iki öğeli kimlik doğrulamasını (2FA) yapılandırıyor. 2FA etkinleştirildiğinde, başarılı oturum açma işlemi için e-posta adresi ve parolaya ek olarak bir kimlik doğrulayıcı uygulaması tarafından oluşturulan bir kod gerekir.

2FA'yı etkinleştirme

Şu anda kimliği doğrulanmış olan kullanıcı için 2FA'yı etkinleştirmek için:

  • İstek gövdesinde /manage/2fa boş bir JSON nesnesi ({}) göndererek uç noktayı çağırın.

  • Yanıt gövdesi, bu noktada gerekli olmayan bazı diğer özelliklerle birlikte SharedKey öğesini sağlar. Kimlik doğrulayıcı uygulamasını ayarlamak için paylaşılan anahtar kullanılır. Yanıt gövdesi örneği:

    {
      "sharedKey": "string",
      "recoveryCodesLeft": 0,
      "recoveryCodes": null,
      "isTwoFactorEnabled": false,
      "isMachineRemembered": false
    }
    
  • Zaman tabanlı tek seferlik parola (TOTP) almak için paylaşılan anahtarı kullanın. Daha fazla bilgi için bkz . ASP.NET Core'da TOTP kimlik doğrulayıcı uygulamaları için QR kodu oluşturmayı etkinleştirme.

  • İstek gövdesine TOTP ve /manage/2fa'yi ekleyerek "enable": true uç noktasını çağırın. Örneğin:

    {
      "enable": true,
      "twoFactorCode": "string"
    }
    
  • Yanıt gövdesi, IsTwoFactorEnabled doğru olduğunu onaylar ve RecoveryCodes sağlar. Kimlik doğrulayıcı uygulaması kullanılabilir olmadığında oturum açmak için kurtarma kodları kullanılır. 2FA başarıyla etkinleştirildikten sonraki yanıt gövdesi örneği:

    {
      "sharedKey": "string",
      "recoveryCodesLeft": 10,
      "recoveryCodes": [
        "string",
        "string",
        "string",
        "string",
        "string",
        "string",
        "string",
        "string",
        "string",
        "string"
      ],
      "isTwoFactorEnabled": true,
      "isMachineRemembered": false
    }
    

2FA ile oturum açma

İstek gövdesinde /login e-posta adresini, parolayı ve TOTP'yi göndererek uç noktayı çağırın. Örneğin:

{
  "email": "string",
  "password": "string",
  "twoFactorCode": "string"
}

Kullanıcının kimlik doğrulayıcı uygulamasına erişimi yoksa, 2FA etkinleştirildiğinde sağlanan kurtarma kodlarından biriyle uç noktayı çağırarak /login oturum açın. İstek gövdesi aşağıdaki örneğe benzer:

{
  "email": "string",
  "password": "string",
  "twoFactorRecoveryCode": "string"
}

Kurtarma kodlarını sıfırlama

Yeni bir kurtarma kodları koleksiyonu almak için, ResetRecoveryCodes ayarlanmış olarak bu uç noktayı true ile çağırın. aşağıda bir istek gövdesi örneği verilmişti:

{
  "resetRecoveryCodes": true
}

Paylaşılan anahtarı sıfırlama

Yeni bir rastgele paylaşılan anahtar almak için, bu uç noktayı ResetSharedKey olarak true ayarlarıyla çağırın. aşağıda bir istek gövdesi örneği verilmişti:

{
  "resetSharedKey": true
}

Anahtarın sıfırlanması, kimliği doğrulanmış kullanıcının daha sonraki bir istek tarafından yeniden etkinleştirilene kadar iki öğeli oturum açma gereksinimini otomatik olarak devre dışı bırakır.

Makineyi unutun

Varsa "beni anımsa bayrağını" temizlemek cookie için bu uç noktayı ForgetMachine true olarak ayarlayın. aşağıda bir istek gövdesi örneği verilmişti:

{
  "forgetMachine": true
}

Bu uç noktanın belirteç tabanlı kimlik doğrulaması üzerinde hiçbir etkisi yoktur.

GET /manage/info uç noktasını kullan

Oturum açmış kullanıcının e-posta adresini ve e-posta onay durumunu alır. İddialar güvenlik nedeniyle bu uç noktadan çıkarıldı. Talep gerekiyorsa, talepler için bir uç nokta ayarlamak üzere sunucu tarafı API'lerini kullanın. Ya da tüm kullanıcıların taleplerini paylaşmak yerine, bir talebi kabul eden ve kullanıcının sahip olup olmadığını yanıtlayan bir doğrulama uç noktası sağlayın.

İstek herhangi bir parametre gerektirmez. Yanıt gövdesi, aşağıdaki örnekte olduğu gibi Email ve IsEmailConfirmed özelliklerini içerir:

{
  "email": "string",
  "isEmailConfirmed": true
}

POST /manage/info uç noktasını kullan

Oturum açmış kullanıcının e-posta adresini ve parolasını güncelleştirir. Örnekte gösterildiği gibi, NewEmail, NewPassword ve OldPassword'yi istek gövdesine gönderin.

{
  "newEmail": "string",
  "newPassword": "string",
  "oldPassword": "string"
}

Yanıt gövdesinin bir örneği aşağıda verilmişti:

{
  "email": "string",
  "isEmailConfirmed": false
}

Ayrıca bkz.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın:

ASP.NET Core şablonları, API yetkilendirme desteğini kullanarak Tek Sayfalı Uygulamalarda (SPA) kimlik doğrulaması sunar. Kullanıcıların kimliğini doğrulamak ve depolamak için ASP.NET CoreIdentity, OpenID Connect'i uygulamak için Duende Identity Server ile birleştirilir.

Önemli

Duende Yazılımı, Duende Identity Server'ın üretim kullanımı için lisans ücreti ödemenizi gerektirebilir. Daha fazla bilgi için bkz. .NET 5'te ASP.NET Core'dan .NET 6'ya geçiş.

Angular ve React proje şablonlarına, Web Uygulaması (Model-Görünüm-Denetleyici) (MVC) ve Web Uygulaması (Sayfalar) proje şablonlarındakine benzer bir kimlik doğrulama parametresi eklendi. İzin verilen parametre değerleri None ve Individual'dır. React.js ve Redux proje şablonu şu anda kimlik doğrulama parametresini desteklemiyor.

API yetkilendirme desteğiyle uygulama oluşturma

Kullanıcı kimlik doğrulaması ve yetkilendirme hem Angular hem de React SPA'ları ile kullanılabilir. Bir komut kabuğu açın ve aşağıdaki komutu çalıştırın:

Angular:

dotnet new angular -au Individual

React:

dotnet new react -au Individual

Yukarıdaki komut, SPA içeren bir ClientApp diziniyle bir ASP.NET Core uygulaması oluşturur.

Uygulamanın ASP.NET Core bileşenlerinin genel açıklaması

Aşağıdaki bölümlerde, kimlik doğrulama desteği dahil edildiğinde projeye yapılan eklemeler açıklanmaktadır:

Program.cs

Aşağıdaki kod örnekleri Microsoft.AspNetCore.ApiAuthorization.IdentityServer NuGet paketini kullanır. Örnekler, API kimlik doğrulaması ve yetkilendirmesini AddApiAuthorization ve AddIdentityServerJwt uzantı yöntemlerini kullanarak yapılandırır. Kimlik doğrulamasıyla React veya Angular SPA proje şablonlarını kullanan projeler bu pakete bir başvuru içerir.

dotnet new angular -au Individual aşağıdaki Program.cs dosyayı oluşturur:

using Microsoft.AspNetCore.Authentication;
using Microsoft.EntityFrameworkCore;
using output_directory_name.Data;
using output_directory_name.Models;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlite(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

builder.Services.AddAuthentication()
    .AddIdentityServerJwt();

builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");
app.MapRazorPages();

app.MapFallbackToFile("index.html");

app.Run();

Yukarıdaki kod aşağıdakileri yapılandırıyor:

  • Identity varsayılan kullanıcı arabirimiyle:

    builder.Services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlite(connectionString));
    builder.Services.AddDatabaseDeveloperPageExceptionFilter();
    
    builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
  • IdentityServer üzerinde, bazı varsayılan ASP.NET Core konvansiyonlarını ayarlayan ek bir AddApiAuthorization yardımcı yöntemi içeren IdentityServer:

    builder.Services.AddIdentityServer()
        .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
    
  • IdentityServer tarafından üretilen JWT belirteçlerini doğrulamak için uygulamayı yapılandıran ek AddIdentityServerJwt bir yardımcı yöntemiyle kimlik doğrulaması:

    builder.Services.AddAuthentication()
    .AddIdentityServerJwt();
    
  • İstek kimlik bilgilerini doğrulamak ve kullanıcıyı istek bağlamında ayarlamakla sorumlu kimlik doğrulama ara yazılımı:

    app.UseAuthentication();
    
  • OpenID Connect uç noktalarını kullanıma sunan IdentityServer ara yazılımı:

    app.UseIdentityServer();
    

Uyarı

Bu makalede bağlantı dizesi kullanımı gösterilmektedir. Yerel bir veritabanıyla kullanıcının kimliğinin doğrulanması gerekmez, ancak üretimde bağlantı dizesi bazen kimlik doğrulaması için bir parola içerir. Kaynak sahibi parola kimlik bilgileri (ROPC), üretim veritabanlarında kaçınılması gereken bir güvenlik riskidir. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Test veya üretim ortamlarına dağıtılan uygulamalar için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

Linux'ta Azure Uygulaması Hizmeti

Linux'ta Azure Uygulaması Hizmeti dağıtımları için vereni açıkça belirtin:

builder.Services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme, 
    options =>
    {
        options.Authority = "{AUTHORITY}";
    });

Önceki kodda {AUTHORITY} yer tutucu, OpenID Connect çağrıları yapılırken kullanılacak olan Authority yer tutucusudur.

Örnek:

options.Authority = "https://contoso-service.azurewebsites.net";

AddApiAuthorization

Bu yardımcı yöntem IdentityServer'ı desteklenen yapılandırmamızı kullanacak şekilde yapılandırıyor. IdentityServer, uygulama güvenliği sorunlarını işlemeye yönelik güçlü ve genişletilebilir bir çerçevedir. Aynı zamanda, en yaygın senaryolar için gereksiz karmaşıklığı ortaya çıkarır. Sonuç olarak, iyi bir başlangıç noktası olarak kabul edilen bir dizi kural ve yapılandırma seçeneği sağlanır. Kimlik doğrulaması gereksinimleriniz değiştikten sonra kimlik doğrulamasını gereksinimlerinize uyacak şekilde özelleştirmek için IdentityServer'ın tüm gücü kullanılabilir duruma gelir.

AddIdentityServerJwt

Bu yardımcı yöntem, uygulama için varsayılan kimlik doğrulama işleyicisi olarak bir ilke şeması yapılandırıyor. İlke, "Identity" URL alanında herhangi bir alt yola yönlendirilen tüm isteklerin Identity tarafından işlenmesine izin verecek şekilde Identity yapılandırılmıştır. JwtBearerHandler diğer tüm istekleri işler. Ayrıca, bu yöntem bir API kaynağını, <<ApplicationName>>API varsayılan kapsamıyla birlikte IdentityServer'a <<ApplicationName>>API kaydeder ve uygulama için IdentityServer tarafından verilen belirteçleri doğrulamak üzere JWT Taşıyıcı belirteç ara yazılımını yapılandırır.

WeatherForecastController

Dosyada, kaynağa erişmek için kullanıcının varsayılan ilkeye göre yetkilendirilmiş olması gerektiğini belirten sınıfa uygulanan [Authorize] özniteliğine dikkat edin. Varsayılan yetkilendirme ilkesi, yukarıda bahsedilen ilke düzeniyle AddIdentityServerJwt tarafından ayarlanan varsayılan kimlik doğrulama düzenini kullanacak şekilde yapılandırılmıştır. Bu, böyle bir yardımcı yöntemle yapılandırılan JwtBearerHandler'ı uygulamaya yönelik istekler için varsayılan işleyici haline getirir.

ApplicationDbContext

Dosyada, IdentityServer şemasını içerecek şekilde DbContext öğesinin Identity öğesini uzattığı bir özel durum hariç, ApiAuthorizationDbContext öğesinde, sırasıyla IdentityDbContext öğesinden türetilmiş daha gelişmiş bir sınıf olan aynı DbContext öğesinin kullanıldığına dikkat edin.

Veritabanı şemasının tam denetimini elde etmek için, kullanılabilir IdentityDbContext sınıflardan birini devralın ve Identity şemasını içerecek şekilde bağlamı yapılandırmak için builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value) yöntemini OnModelCreating üzerinde çağırın.

OidcConfigurationController

dosyasında, istemcinin kullanması gereken OIDC parametrelerini sunmak için sağlanan uç noktaya dikkat edin.

appsettings.json

appsettings.json Proje kökü dosyasında, yapılandırılmış istemcilerin listesini açıklayan yeni IdentityServer bir bölüm vardı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. Sunucu için yapılandırma işlemini basitleştiren kuralları yönlendirmek için dahili olarak kullanılır. Uygulama profilleri bölümünde açıklandığı gibi, kullanılabilir birkaç profil vardır.

"IdentityServer": {
  "Clients": {
    "angularindividualpreview3final": {
      "Profile": "IdentityServerSPA"
    }
  }
}

appsettings.Development.json

appsettings.Development.json Proje kökü dosyasında belirteçleri imzalamak için kullanılan anahtarı açıklayan bir IdentityServer bölüm vardır. Üretim ortamına dağıtım yaparken, Üretime dağıt bölümünde açıklandığı gibi, bir anahtarın uygulamayla birlikte sağlanması ve devreye alınması gerekir.

"IdentityServer": {
  "Key": {
    "Type": "Development"
  }
}

Angular uygulamasının genel açıklaması

Angular şablonundaki kimlik doğrulaması ve API yetkilendirme desteği, ClientApp/src/api-authorization dizinindeki kendi Angular modülünde bulunur. Modül aşağıdaki öğelerden oluşur:

  • 3 bileşen:
    • login.component.ts: Uygulamanın oturum açma akışını işler.
    • logout.component.ts: Uygulamanın oturum kapatma akışını işler.
    • login-menu.component.ts: Aşağıdaki bağlantı kümelerinden birini görüntüleyen pencere öğesi:
      • Doğrulanmış bir kullanıcı olduğunda, kullanıcı profili yönetimi ve oturum kapatma bağlantıları.
      • Kullanıcının kimliği doğrulanmamışsa kayıt ve oturum açma bağlantıları.
  • Rotalara eklenebilen ve bir kullanıcı yolu ziyaret etmeden önce kimliğinin doğrulanmasını gerektiren rota koruması AuthorizeGuard.
  • Kullanıcı kimliği doğrulandığında, API'ye yönelik giden HTTP isteklerine erişim belirtecini ekleyen bir HTTP durdurucusu AuthorizeInterceptor.
  • Kimlik doğrulama işleminin alt düzey ayrıntılarını işleyen ve kimliği doğrulanmış kullanıcı hakkındaki bilgileri uygulamanın geri kalanında kullanıma sunan bir hizmet AuthorizeService.
  • Uygulamanın kimlik doğrulama bölümleriyle ilişkili yolları tanımlayan bir Angular modülü. Oturum açma menüsü bileşenini, interceptörü, korumayı ve hizmeti uygulamanın geri kalanı tarafından tüketilmesi için sunar.

React uygulamasının genel açıklaması

React şablonundaki kimlik doğrulaması ve API yetkilendirme desteği ClientApp/src/components/api-authorization dizininde bulunur. Aşağıdaki öğelerden oluşur:

  • 4 bileşen:
    • Login.js: Uygulamanın oturum açma akışını işler.
    • Logout.js: Uygulamanın oturum kapatma akışını işler.
    • LoginMenu.js: Aşağıdaki bağlantı kümelerinden birini görüntüleyen pencere öğesi:
      • Doğrulanmış bir kullanıcı olduğunda, kullanıcı profili yönetimi ve oturum kapatma bağlantıları.
      • Kullanıcının kimliği doğrulanmamışsa kayıt ve oturum açma bağlantıları.
    • AuthorizeRoute.js: Parametresinde Component belirtilen bileşeni işlemeden önce kullanıcının kimliğinin doğrulanması gereken bir yol bileşeni.
  • Uygulamanın geri kalanında kimliği doğrulanmış kullanıcı hakkındaki bilgileri kullanıma sunan ve kimlik doğrulama sürecinin alt düzey ayrıntılarını işleyen, sınıf authService’in ihraç edilmiş bir AuthorizeService örneği.

Çözümün ana bileşenlerini gördüğünüze göre, uygulama senaryolarına daha ayrıntılı bir şekilde göz atabilirsiniz.

Yeni BIR API'de yetkilendirme iste

Varsayılan olarak, sistem yeni API'ler için kolayca yetkilendirme gerektirecek şekilde yapılandırılır. Bunu yapmak için yeni bir denetleyici oluşturun ve özniteliğini denetleyici sınıfına veya denetleyici içindeki herhangi bir eyleme ekleyin [Authorize] .

API kimlik doğrulama işleyicisini özelleştirme

API'nin JWT işleyicisinin yapılandırmasını özelleştirmek için örneğini JwtBearerOptions yapılandırın:

builder.Services.AddAuthentication()
    .AddIdentityServerJwt();

builder.Services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme,
    options =>
    {
        ...
    });

API'nin JWT işleyicisi, JwtBearerEvents kullanarak kimlik doğrulama işlemi üzerinde denetimi etkinleştiren olaylar oluşturur. API yetkilendirme AddIdentityServerJwt desteği sağlamak için kendi olay işleyicilerini kaydeder.

Bir olayın işlenmesini özelleştirmek için mevcut olay işleyicisini gerektiği takdirde ek mantık ekleyerek sarın. Örneğin:

builder.Services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme,
    options =>
    {
        var onTokenValidated = options.Events.OnTokenValidated;       

        options.Events.OnTokenValidated = async context =>
        {
            await onTokenValidated(context);
            ...
        }
    });

Yukarıdaki kodda OnTokenValidated , olay işleyicisi özel bir uygulamayla değiştirilir. Bu uygulama:

  1. API yetkilendirme desteği tarafından sağlanan özgün uygulamayı çağırır.
  2. Kendi özel mantığını çalıştırın.

İstemci tarafı rotasını koruma (Angular)

İstemci tarafı yolunun korunması, bir yol yapılandırılırken çalıştırılacak koruma listesine yetki koruması eklenerek yapılır. Örneğin, ana uygulama Angular modülünde, fetch-data yolunun nasıl yapılandırıldığını görebilirsiniz.

RouterModule.forRoot([
  // ...
  { path: 'fetch-data', component: FetchDataComponent, canActivate: [AuthorizeGuard] },
])

Bir yolu korumanın gerçek uç noktayı korumadığını (buna hala bir [Authorize] özniteliğin uygulanmasını gerektirdiğini) ancak kullanıcının yalnızca kimliği doğrulanmadığında verilen istemci tarafı yoluna geçmesini engellediğini belirtmek önemlidir.

API isteklerinin kimliğini doğrulama (Angular)

Uygulamayla birlikte barındırılan API'lere yönelik isteklerin kimlik doğrulaması, uygulama tarafından tanımlanan HTTP istemci kesme aracının kullanılmasıyla otomatik olarak gerçekleştirilir.

İstemci tarafı yolunu koruma (React)

İstemci tarafı rotayı, düz AuthorizeRoute bileşeni yerine Route bileşenini kullanarak koruyun. Örneğin, fetch-data rotasının App bileşeni içinde nasıl yapılandırıldığına dikkat edin.

<AuthorizeRoute path='/fetch-data' component={FetchData} />

Bir yolu koruma:

  • Gerçek uç noktayı korumaz (yine de buna bir [Authorize] öznitelik uygulanmasını gerektirir).
  • Yalnızca kullanıcının kimliği doğrulanmadığında, verilen istemci tarafı yoluna geçişini engeller.

API isteklerinin kimliğini doğrulama (React)

React ile isteklerin kimlik doğrulaması, önce authService'den AuthorizeService örneği içe aktarılarak gerçekleştirilir. Erişim belirteci authService'den alınır ve aşağıda gösterildiği gibi isteğe eklenir. React bileşenlerinde bu iş genellikle yaşam döngüsü yönteminde componentDidMount veya bazı kullanıcı etkileşimlerinin sonucu olarak gerçekleştirilir.

authService bileşenini bir bileşene aktarma

import authService from './api-authorization/AuthorizeService'

Erişim belirtecini alma ve yanıta ekleme

async populateWeatherData() {
  const token = await authService.getAccessToken();
  const response = await fetch('api/SampleData/WeatherForecasts', {
    headers: !token ? {} : { 'Authorization': `Bearer ${token}` }
  });
  const data = await response.json();
  this.setState({ forecasts: data, loading: false });
}

Üretime dağıt

Uygulamayı üretim ortamına dağıtmak için aşağıdaki kaynakların sağlanması gerekir:

  • Kullanıcı hesaplarını ve IdentityServer izinlerini depolamak için bir veritabanı Identity.
  • İmzalama belirteçleri için kullanılacak bir üretim sertifikası.
    • Bu sertifika için belirli bir gereksinim yoktur; otomatik olarak imzalanan bir sertifika veya CA yetkilisi aracılığıyla sağlanan bir sertifika olabilir.
    • PowerShell veya OpenSSL gibi standart araçlar aracılığıyla oluşturulabilir.
    • Hedef makinelerde sertifika deposuna yüklenebilir veya güçlü bir parolayla .pfx dosyası olarak dağıtılabilir.

Örnek: Azure dışı bir web barındırma sağlayıcısına dağıtma

Web barındırma panelinizde sertifikanızı oluşturun veya yükleyin. Ardından uygulamanın appsettings.json dosyasında, IdentityServer bölümünü anahtar ayrıntıları içerecek şekilde değiştirin. Örneğin:

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "WebHosting",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyApplication"
  }
}

Yukarıdaki örnekte:

  • StoreName , sertifikanın depolandığı sertifika deposunun adını temsil eder. Bu durumda, web barındırma mağazasını işaret eder.
  • StoreLocation , (CurrentUser bu durumda) sertifikanın yüklendiği yeri temsil eder.
  • Name sertifikanın ayırt edici konusuna karşılık gelir.

Örnek: Azure Uygulaması Hizmetine Dağıtma

Bu bölümde, sertifika deposunda depolanan bir sertifika kullanarak uygulamanın Azure Uygulaması Hizmetine dağıtılması açıklanmaktadır. Uygulamayı sertifika deposundan bir sertifika yüklenecek şekilde değiştirmek için, sonraki bir adımda Azure portalında uygulamayı yapılandırırken Standart katman hizmet planı veya daha iyisi gerekir.

Uygulamanın appsettings.json dosyasındaki IdentityServer bölümünü, önemli ayrıntıları içerecek şekilde değiştirin.

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyApplication"
  }
}
  • Depo adı, sertifikanın depolandığı sertifika deposunun adını temsil eder. Bu durumda, kişisel kullanıcı deposuna işaret eder.
  • Depo konumu, (CurrentUser veya LocalMachine) konumundan sertifikanın yüklendiği yeri temsil eder.
  • Sertifikadaki isim özelliği, sertifikanın ayırt edici öznesine karşılık gelir.

Azure Uygulaması Hizmeti'ne dağıtmak için, gerekli Azure kaynaklarının nasıl oluşturulacağını ve uygulamanın üretime nasıl dağıtılacağına ilişkin adımları izleyerek uygulamayı Azure'a dağıtma.

Önceki yönergeleri takip ettikten sonra uygulama Azure'a dağıtılır ancak henüz işlevsel değildir. Uygulama tarafından kullanılan sertifikaNın Azure portalında yapılandırılması gerekir. Sertifikanın parmak izini bulun ve Sertifikalarınızı yükleme bölümünde açıklanan adımları izleyin.

Bu adımlarda SSL'den bahsedilirken, Azure portalında sağlanan sertifikayı uygulamayla birlikte kullanmak üzere karşıya yükleyebileceğiniz bir Özel sertifikalar bölümü vardır.

Azure portalında uygulamayı ve uygulamanın ayarlarını yapılandırdıktan sonra portalda uygulamayı yeniden başlatın.

Diğer yapılandırma seçenekleri

API yetkilendirme desteği, BIR dizi kural, varsayılan değer ve SPA deneyimini basitleştirmeye yönelik geliştirmelerle IdentityServer'ın üzerine kurulur. Belirtmeye gerek yok, ASP.NET Core tümleştirmeleri senaryonuzu kapsamazsa, IdentityServer'ın tüm gücü arka planda kullanılabilir. ASP.NET Core desteği, tüm uygulamaların kuruluşumuz tarafından oluşturulduğu ve dağıtıldığı "birinci taraf" uygulamalara odaklanmıştır. Bu nedenle, onay veya federasyon gibi şeyler için destek sunulmaz. Bu senaryolar için IdentityServer'ı kullanın ve belgelerini izleyin.

Uygulama profilleri

Uygulama profilleri, parametrelerini daha fazla tanımlayan uygulamalar için önceden tanımlanmış yapılandırmalardır. Şu anda aşağıdaki profiller desteklenir:

  • IdentityServerSPA: IdentityServer ile birlikte barındırılan spayı tek bir birim olarak temsil eder.
    • redirect_uri varsayılan değeridir/authentication/login-callback.
    • post_logout_redirect_uri varsayılan değeridir/authentication/logout-callback.
    • Kapsam kümesi, openid, profile, ve uygulamadaki API'ler için tanımlanan her kapsamı içerir.
    • İzin verilen OIDC yanıt türleri kümesi id_token token veya her biri tek başına (id_token, token) olarak belirlenmiştir.
    • İzin verilen yanıt modu şeklindedir fragment.
  • SPA: IdentityServer ile barındırılmayan bir SPA'yı temsil eder.
    • Kapsam kümesi, openid, profile, ve uygulamadaki API'ler için tanımlanan her kapsamı içerir.
    • İzin verilen OIDC yanıt türleri kümesi id_token token veya her biri tek başına (id_token, token) olarak belirlenmiştir.
    • İzin verilen yanıt modu şeklindedir fragment.
  • IdentityServerJwt: IdentityServer ile birlikte barındırılan bir API'yi temsil eder.
    • Uygulama, varsayılan olarak uygulama adı olan tek bir kapsama sahip olacak şekilde yapılandırılır.
  • API: IdentityServer ile barındırılmıyor bir API'yi temsil eder.
    • Uygulama, varsayılan olarak uygulama adı olan tek bir kapsama sahip olacak şekilde yapılandırılır.

AppSettings aracılığıyla yapılandırma

Yapılandırma sistemi aracılığıyla uygulamaları, Clients veya Resources listesine ekleyerek yapılandırın.

Aşağıdaki örnekte gösterildiği gibi her istemcinin redirect_uri ve post_logout_redirect_uri özelliğini yapılandırın:

"IdentityServer": {
  "Clients": {
    "MySPA": {
      "Profile": "SPA",
      "RedirectUri": "https://www.example.com/authentication/login-callback",
      "LogoutUri": "https://www.example.com/authentication/logout-callback"
    }
  }
}

Kaynakları yapılandırırken, aşağıda gösterildiği gibi kaynağın kapsamlarını yapılandırabilirsiniz:

"IdentityServer": {
  "Resources": {
    "MyExternalApi": {
      "Profile": "API",
      "Scopes": "a b c"
    }
  }
}

Kod aracılığıyla yapılandırma

İstemcileri ve kaynakları, seçenekleri yapılandırmak için bir eylem alan AddApiAuthorization aşırı yüklemesini kullanarak kod aracılığıyla da yapılandırabilirsiniz.

AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options =>
{
    options.Clients.AddSPA(
        "My SPA", spa =>
        spa.WithRedirectUri("http://www.example.com/authentication/login-callback")
           .WithLogoutRedirectUri(
               "http://www.example.com/authentication/logout-callback"));

    options.ApiResources.AddApiResource("MyExternalApi", resource =>
        resource.WithScopes("a", "b", "c"));
});

Ek kaynaklar

ASP.NET Core 3.1 veya üzeri şablonlar, API yetkilendirme desteğini kullanarak Tek Sayfalı Uygulamalarda (SPA) kimlik doğrulaması sunar. Kullanıcıların kimliğini doğrulamak ve depolamak için ASP.NET CoreIdentity, OpenID Connect'i uygulamak için IdentityServer ile birleştirilir.

Angular ve React proje şablonlarına, Web Uygulaması (Model-Görünüm-Denetleyici) (MVC) ve Web Uygulaması (Sayfalar) proje şablonlarındakine benzer bir kimlik doğrulama parametresi eklendi. İzin verilen parametre değerleri None ve Individual'dır. React.js ve Redux proje şablonu şu anda kimlik doğrulama parametresini desteklemiyor.

API yetkilendirme desteğiyle uygulama oluşturma

Kullanıcı kimlik doğrulaması ve yetkilendirme hem Angular hem de React SPA'ları ile kullanılabilir. Bir komut kabuğu açın ve aşağıdaki komutu çalıştırın:

Angular:

dotnet new angular -o <output_directory_name> 

React:

dotnet new react -o <output_directory_name> -au Individual

Yukarıdaki komut, SPA içeren bir ClientApp diziniyle bir ASP.NET Core uygulaması oluşturur.

Uygulamanın ASP.NET Core bileşenlerinin genel açıklaması

Aşağıdaki bölümlerde, kimlik doğrulama desteği dahil edildiğinde projeye yapılan eklemeler açıklanmaktadır:

Startup sınıfı

Aşağıdaki kod örnekleri Microsoft.AspNetCore.ApiAuthorization.IdentityServer NuGet paketini kullanır. Örnekler, API kimlik doğrulaması ve yetkilendirmesini AddApiAuthorization ve AddIdentityServerJwt uzantı yöntemlerini kullanarak yapılandırır. Kimlik doğrulamasıyla React veya Angular SPA proje şablonlarını kullanan projeler bu pakete bir başvuru içerir.

sınıfı Startup aşağıdaki eklemelere sahiptir:

  • Startup.ConfigureServices yönteminin içinde

    • Identity varsayılan kullanıcı arabirimiyle:

      services.AddDbContext<ApplicationDbContext>(options =>
          options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
      
      services.AddDefaultIdentity<ApplicationUser>()
          .AddEntityFrameworkStores<ApplicationDbContext>();
      
    • IdentityServer üzerinde, bazı varsayılan ASP.NET Core konvansiyonlarını ayarlayan ek bir AddApiAuthorization yardımcı yöntemi içeren IdentityServer:

      services.AddIdentityServer()
          .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
      
    • IdentityServer tarafından üretilen JWT belirteçlerini doğrulamak için uygulamayı yapılandıran ek AddIdentityServerJwt bir yardımcı yöntemiyle kimlik doğrulaması:

      services.AddAuthentication()
          .AddIdentityServerJwt();
      
  • Startup.Configure yönteminin içinde

    • İstek kimlik bilgilerini doğrulamak ve kullanıcıyı istek bağlamında ayarlamakla sorumlu kimlik doğrulama ara yazılımı:

      app.UseAuthentication();
      
    • OpenID Connect uç noktalarını kullanıma sunan IdentityServer ara yazılımı:

      app.UseIdentityServer();
      

Uyarı

Bu makalede bağlantı dizesi kullanımı gösterilmektedir. Yerel bir veritabanıyla kullanıcının kimliğinin doğrulanması gerekmez, ancak üretimde bağlantı dizesi bazen kimlik doğrulaması için bir parola içerir. Kaynak sahibi parola kimlik bilgileri (ROPC), üretim veritabanlarında kaçınılması gereken bir güvenlik riskidir. Üretim uygulamaları kullanılabilir en güvenli kimlik doğrulama akışını kullanmalıdır. Test veya üretim ortamlarına dağıtılan uygulamalar için kimlik doğrulaması hakkında daha fazla bilgi için bkz . Güvenli kimlik doğrulama akışları.

Linux'ta Azure Uygulaması Hizmeti

Linux'ta Azure Uygulama Hizmeti dağıtımları için, vereni Startup.ConfigureServices içinde açıkça belirtin.

services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme, 
    options =>
    {
        options.Authority = "{AUTHORITY}";
    });

Önceki kodda {AUTHORITY} yer tutucu, OpenID Connect çağrıları yapılırken kullanılacak olan Authority yer tutucusudur.

Örnek:

options.Authority = "https://contoso-service.azurewebsites.net";

AddApiAuthorization

Bu yardımcı yöntem IdentityServer'ı desteklenen yapılandırmamızı kullanacak şekilde yapılandırıyor. IdentityServer, uygulama güvenliği sorunlarını işlemeye yönelik güçlü ve genişletilebilir bir çerçevedir. Aynı zamanda, en yaygın senaryolar için gereksiz karmaşıklığı ortaya çıkarır. Sonuç olarak, iyi bir başlangıç noktası olarak kabul edilen bir dizi kural ve yapılandırma seçeneği sağlanır. Kimlik doğrulaması gereksinimleriniz değiştikten sonra kimlik doğrulamasını gereksinimlerinize uyacak şekilde özelleştirmek için IdentityServer'ın tüm gücü kullanılabilir duruma gelir.

AddIdentityServerJwt

Bu yardımcı yöntem, uygulama için varsayılan kimlik doğrulama işleyicisi olarak bir ilke şeması yapılandırıyor. İlke, "Identity" URL alanında herhangi bir alt yola yönlendirilen tüm isteklerin Identity tarafından işlenmesine izin verecek şekilde Identity yapılandırılmıştır. JwtBearerHandler diğer tüm istekleri işler. Ayrıca, bu yöntem bir API kaynağını, <<ApplicationName>>API varsayılan kapsamıyla birlikte IdentityServer'a <<ApplicationName>>API kaydeder ve uygulama için IdentityServer tarafından verilen belirteçleri doğrulamak üzere JWT Taşıyıcı belirteç ara yazılımını yapılandırır.

WeatherForecastController

Dosyada, kaynağa erişmek için kullanıcının varsayılan ilkeye göre yetkilendirilmiş olması gerektiğini belirten sınıfa uygulanan [Authorize] özniteliğine dikkat edin. Varsayılan yetkilendirme ilkesi, yukarıda bahsedilen ilke düzeniyle AddIdentityServerJwt tarafından ayarlanan varsayılan kimlik doğrulama düzenini kullanacak şekilde yapılandırılmıştır. Bu, böyle bir yardımcı yöntemle yapılandırılan JwtBearerHandler'ı uygulamaya yönelik istekler için varsayılan işleyici haline getirir.

ApplicationDbContext

Dosyada, IdentityServer şemasını içerecek şekilde DbContext öğesinin Identity öğesini uzattığı bir özel durum hariç, ApiAuthorizationDbContext öğesinde, sırasıyla IdentityDbContext öğesinden türetilmiş daha gelişmiş bir sınıf olan aynı DbContext öğesinin kullanıldığına dikkat edin.

Veritabanı şemasının tam denetimini elde etmek için, kullanılabilir IdentityDbContext sınıflardan birini devralın ve Identity şemasını içerecek şekilde bağlamı yapılandırmak için builder.ConfigurePersistedGrantContext(_operationalStoreOptions.Value) yöntemini OnModelCreating üzerinde çağırın.

OidcConfigurationController

dosyasında, istemcinin kullanması gereken OIDC parametrelerini sunmak için sağlanan uç noktaya dikkat edin.

appsettings.json

appsettings.json Proje kökü dosyasında, yapılandırılmış istemcilerin listesini açıklayan yeni IdentityServer bir bölüm vardı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. Sunucu için yapılandırma işlemini basitleştiren kuralları yönlendirmek için dahili olarak kullanılır. Uygulama profilleri bölümünde açıklandığı gibi, kullanılabilir birkaç profil vardır.

"IdentityServer": {
  "Clients": {
    "angularindividualpreview3final": {
      "Profile": "IdentityServerSPA"
    }
  }
}

appsettings.Development.json

appsettings.Development.json Proje kökü dosyasında belirteçleri imzalamak için kullanılan anahtarı açıklayan bir IdentityServer bölüm vardır. Üretim ortamına dağıtım yaparken, Üretime dağıt bölümünde açıklandığı gibi, bir anahtarın uygulamayla birlikte sağlanması ve devreye alınması gerekir.

"IdentityServer": {
  "Key": {
    "Type": "Development"
  }
}

Angular uygulamasının genel açıklaması

Angular şablonundaki kimlik doğrulaması ve API yetkilendirme desteği, ClientApp/src/api-authorization dizinindeki kendi Angular modülünde bulunur. Modül aşağıdaki öğelerden oluşur:

  • 3 bileşen:
    • login.component.ts: Uygulamanın oturum açma akışını işler.
    • logout.component.ts: Uygulamanın oturum kapatma akışını işler.
    • login-menu.component.ts: Aşağıdaki bağlantı kümelerinden birini görüntüleyen pencere öğesi:
      • Doğrulanmış bir kullanıcı olduğunda, kullanıcı profili yönetimi ve oturum kapatma bağlantıları.
      • Kullanıcının kimliği doğrulanmamışsa kayıt ve oturum açma bağlantıları.
  • Rotalara eklenebilen ve bir kullanıcı yolu ziyaret etmeden önce kimliğinin doğrulanmasını gerektiren rota koruması AuthorizeGuard.
  • Kullanıcı kimliği doğrulandığında, API'ye yönelik giden HTTP isteklerine erişim belirtecini ekleyen bir HTTP durdurucusu AuthorizeInterceptor.
  • Kimlik doğrulama işleminin alt düzey ayrıntılarını işleyen ve kimliği doğrulanmış kullanıcı hakkındaki bilgileri uygulamanın geri kalanında kullanıma sunan bir hizmet AuthorizeService.
  • Uygulamanın kimlik doğrulama bölümleriyle ilişkili yolları tanımlayan bir Angular modülü. Oturum açma menüsü bileşenini, interceptörü, korumayı ve hizmeti uygulamanın geri kalanı tarafından tüketilmesi için sunar.

React uygulamasının genel açıklaması

React şablonundaki kimlik doğrulaması ve API yetkilendirme desteği ClientApp/src/components/api-authorization dizininde bulunur. Aşağıdaki öğelerden oluşur:

  • 4 bileşen:
    • Login.js: Uygulamanın oturum açma akışını işler.
    • Logout.js: Uygulamanın oturum kapatma akışını işler.
    • LoginMenu.js: Aşağıdaki bağlantı kümelerinden birini görüntüleyen pencere öğesi:
      • Doğrulanmış bir kullanıcı olduğunda, kullanıcı profili yönetimi ve oturum kapatma bağlantıları.
      • Kullanıcının kimliği doğrulanmamışsa kayıt ve oturum açma bağlantıları.
    • AuthorizeRoute.js: Parametresinde Component belirtilen bileşeni işlemeden önce kullanıcının kimliğinin doğrulanması gereken bir yol bileşeni.
  • Uygulamanın geri kalanında kimliği doğrulanmış kullanıcı hakkındaki bilgileri kullanıma sunan ve kimlik doğrulama sürecinin alt düzey ayrıntılarını işleyen, sınıf authService’in ihraç edilmiş bir AuthorizeService örneği.

Çözümün ana bileşenlerini gördüğünüze göre, uygulama senaryolarına daha ayrıntılı bir şekilde göz atabilirsiniz.

Yeni BIR API'de yetkilendirme iste

Varsayılan olarak, sistem yeni API'ler için kolayca yetkilendirme gerektirecek şekilde yapılandırılır. Bunu yapmak için yeni bir denetleyici oluşturun ve özniteliğini denetleyici sınıfına veya denetleyici içindeki herhangi bir eyleme ekleyin [Authorize] .

API kimlik doğrulama işleyicisini özelleştirme

API'nin JWT işleyicisinin yapılandırmasını özelleştirmek için örneğini JwtBearerOptions yapılandırın:

services.AddAuthentication()
    .AddIdentityServerJwt();

services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme,
    options =>
    {
        ...
    });

API'nin JWT işleyicisi, JwtBearerEvents kullanarak kimlik doğrulama işlemi üzerinde denetimi etkinleştiren olaylar oluşturur. API yetkilendirme AddIdentityServerJwt desteği sağlamak için kendi olay işleyicilerini kaydeder.

Bir olayın işlenmesini özelleştirmek için mevcut olay işleyicisini gerektiği takdirde ek mantık ekleyerek sarın. Örneğin:

services.Configure<JwtBearerOptions>(
    IdentityServerJwtConstants.IdentityServerJwtBearerScheme,
    options =>
    {
        var onTokenValidated = options.Events.OnTokenValidated;       

        options.Events.OnTokenValidated = async context =>
        {
            await onTokenValidated(context);
            ...
        }
    });

Yukarıdaki kodda OnTokenValidated , olay işleyicisi özel bir uygulamayla değiştirilir. Bu uygulama:

  1. API yetkilendirme desteği tarafından sağlanan özgün uygulamayı çağırır.
  2. Kendi özel mantığını çalıştırın.

İstemci tarafı rotasını koruma (Angular)

İstemci tarafı yolunun korunması, bir yol yapılandırılırken çalıştırılacak koruma listesine yetki koruması eklenerek yapılır. Örneğin, ana uygulama Angular modülünde, fetch-data yolunun nasıl yapılandırıldığını görebilirsiniz.

RouterModule.forRoot([
  // ...
  { path: 'fetch-data', component: FetchDataComponent, canActivate: [AuthorizeGuard] },
])

Bir yolu korumanın gerçek uç noktayı korumadığını (buna hala bir [Authorize] özniteliğin uygulanmasını gerektirdiğini) ancak kullanıcının yalnızca kimliği doğrulanmadığında verilen istemci tarafı yoluna geçmesini engellediğini belirtmek önemlidir.

API isteklerinin kimliğini doğrulama (Angular)

Uygulamayla birlikte barındırılan API'lere yönelik isteklerin kimlik doğrulaması, uygulama tarafından tanımlanan HTTP istemci kesme aracının kullanılmasıyla otomatik olarak gerçekleştirilir.

İstemci tarafı yolunu koruma (React)

İstemci tarafı rotayı, düz AuthorizeRoute bileşeni yerine Route bileşenini kullanarak koruyun. Örneğin, fetch-data rotasının App bileşeni içinde nasıl yapılandırıldığına dikkat edin.

<AuthorizeRoute path='/fetch-data' component={FetchData} />

Bir yolu koruma:

  • Gerçek uç noktayı korumaz (yine de buna bir [Authorize] öznitelik uygulanmasını gerektirir).
  • Yalnızca kullanıcının kimliği doğrulanmadığında, verilen istemci tarafı yoluna geçişini engeller.

API isteklerinin kimliğini doğrulama (React)

React ile isteklerin kimlik doğrulaması, önce authService'den AuthorizeService örneği içe aktarılarak gerçekleştirilir. Erişim belirteci authService'den alınır ve aşağıda gösterildiği gibi isteğe eklenir. React bileşenlerinde bu iş genellikle yaşam döngüsü yönteminde componentDidMount veya bazı kullanıcı etkileşimlerinin sonucu olarak gerçekleştirilir.

authService bileşenini bir bileşene aktarma

import authService from './api-authorization/AuthorizeService'

Erişim belirtecini alma ve yanıta ekleme

async populateWeatherData() {
  const token = await authService.getAccessToken();
  const response = await fetch('api/SampleData/WeatherForecasts', {
    headers: !token ? {} : { 'Authorization': `Bearer ${token}` }
  });
  const data = await response.json();
  this.setState({ forecasts: data, loading: false });
}

Üretime dağıt

Uygulamayı üretim ortamına dağıtmak için aşağıdaki kaynakların sağlanması gerekir:

  • Kullanıcı hesaplarını ve IdentityServer izinlerini depolamak için bir veritabanı Identity.
  • İmzalama belirteçleri için kullanılacak bir üretim sertifikası.
    • Bu sertifika için belirli bir gereksinim yoktur; otomatik olarak imzalanan bir sertifika veya CA yetkilisi aracılığıyla sağlanan bir sertifika olabilir.
    • PowerShell veya OpenSSL gibi standart araçlar aracılığıyla oluşturulabilir.
    • Hedef makinelerde sertifika deposuna yüklenebilir veya güçlü bir parolayla .pfx dosyası olarak dağıtılabilir.

Örnek: Azure dışı bir web barındırma sağlayıcısına dağıtma

Web barındırma panelinizde sertifikanızı oluşturun veya yükleyin. Ardından uygulamanın appsettings.json dosyasında, IdentityServer bölümünü anahtar ayrıntıları içerecek şekilde değiştirin. Örneğin:

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "WebHosting",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyApplication"
  }
}

Yukarıdaki örnekte:

  • StoreName , sertifikanın depolandığı sertifika deposunun adını temsil eder. Bu durumda, web barındırma mağazasını işaret eder.
  • StoreLocation , (CurrentUser bu durumda) sertifikanın yüklendiği yeri temsil eder.
  • Name sertifikanın ayırt edici konusuna karşılık gelir.

Örnek: Azure Uygulaması Hizmetine Dağıtma

Bu bölümde, sertifika deposunda depolanan bir sertifika kullanarak uygulamanın Azure Uygulaması Hizmetine dağıtılması açıklanmaktadır. Uygulamayı sertifika deposundan bir sertifika yüklenecek şekilde değiştirmek için, sonraki bir adımda Azure portalında uygulamayı yapılandırırken Standart katman hizmet planı veya daha iyisi gerekir.

Uygulamanın appsettings.json dosyasındaki IdentityServer bölümünü, önemli ayrıntıları içerecek şekilde değiştirin.

"IdentityServer": {
  "Key": {
    "Type": "Store",
    "StoreName": "My",
    "StoreLocation": "CurrentUser",
    "Name": "CN=MyApplication"
  }
}
  • Depo adı, sertifikanın depolandığı sertifika deposunun adını temsil eder. Bu durumda, kişisel kullanıcı deposuna işaret eder.
  • Depo konumu, (CurrentUser veya LocalMachine) konumundan sertifikanın yüklendiği yeri temsil eder.
  • Sertifikadaki isim özelliği, sertifikanın ayırt edici öznesine karşılık gelir.

Azure Uygulaması Hizmeti'ne dağıtmak için, gerekli Azure kaynaklarının nasıl oluşturulacağını ve uygulamanın üretime nasıl dağıtılacağına ilişkin adımları izleyerek uygulamayı Azure'a dağıtma.

Önceki yönergeleri takip ettikten sonra uygulama Azure'a dağıtılır ancak henüz işlevsel değildir. Uygulama tarafından kullanılan sertifikaNın Azure portalında yapılandırılması gerekir. Sertifikanın parmak izini bulun ve Sertifikalarınızı yükleme bölümünde açıklanan adımları izleyin.

Bu adımlarda SSL'den bahsedilirken, Azure portalında sağlanan sertifikayı uygulamayla birlikte kullanmak üzere karşıya yükleyebileceğiniz bir Özel sertifikalar bölümü vardır.

Azure portalında uygulamayı ve uygulamanın ayarlarını yapılandırdıktan sonra portalda uygulamayı yeniden başlatın.

Diğer yapılandırma seçenekleri

API yetkilendirme desteği, BIR dizi kural, varsayılan değer ve SPA deneyimini basitleştirmeye yönelik geliştirmelerle IdentityServer'ın üzerine kurulur. Belirtmeye gerek yok, ASP.NET Core tümleştirmeleri senaryonuzu kapsamazsa, IdentityServer'ın tüm gücü arka planda kullanılabilir. ASP.NET Core desteği, tüm uygulamaların kuruluşumuz tarafından oluşturulduğu ve dağıtıldığı "birinci taraf" uygulamalara odaklanmıştır. Bu nedenle, onay veya federasyon gibi şeyler için destek sunulmaz. Bu senaryolar için IdentityServer'ı kullanın ve belgelerini izleyin.

Uygulama profilleri

Uygulama profilleri, parametrelerini daha fazla tanımlayan uygulamalar için önceden tanımlanmış yapılandırmalardır. Şu anda aşağıdaki profiller desteklenir:

  • IdentityServerSPA: IdentityServer ile birlikte barındırılan spayı tek bir birim olarak temsil eder.
    • redirect_uri varsayılan değeridir/authentication/login-callback.
    • post_logout_redirect_uri varsayılan değeridir/authentication/logout-callback.
    • Kapsam kümesi, openid, profile, ve uygulamadaki API'ler için tanımlanan her kapsamı içerir.
    • İzin verilen OIDC yanıt türleri kümesi id_token token veya her biri tek başına (id_token, token) olarak belirlenmiştir.
    • İzin verilen yanıt modu şeklindedir fragment.
  • SPA: IdentityServer ile barındırılmayan bir SPA'yı temsil eder.
    • Kapsam kümesi, openid, profile, ve uygulamadaki API'ler için tanımlanan her kapsamı içerir.
    • İzin verilen OIDC yanıt türleri kümesi id_token token veya her biri tek başına (id_token, token) olarak belirlenmiştir.
    • İzin verilen yanıt modu şeklindedir fragment.
  • IdentityServerJwt: IdentityServer ile birlikte barındırılan bir API'yi temsil eder.
    • Uygulama, varsayılan olarak uygulama adı olan tek bir kapsama sahip olacak şekilde yapılandırılır.
  • API: IdentityServer ile barındırılmıyor bir API'yi temsil eder.
    • Uygulama, varsayılan olarak uygulama adı olan tek bir kapsama sahip olacak şekilde yapılandırılır.

AppSettings aracılığıyla yapılandırma

Yapılandırma sistemi aracılığıyla uygulamaları, Clients veya Resources listesine ekleyerek yapılandırın.

Aşağıdaki örnekte gösterildiği gibi her istemcinin redirect_uri ve post_logout_redirect_uri özelliğini yapılandırın:

"IdentityServer": {
  "Clients": {
    "MySPA": {
      "Profile": "SPA",
      "RedirectUri": "https://www.example.com/authentication/login-callback",
      "LogoutUri": "https://www.example.com/authentication/logout-callback"
    }
  }
}

Kaynakları yapılandırırken, aşağıda gösterildiği gibi kaynağın kapsamlarını yapılandırabilirsiniz:

"IdentityServer": {
  "Resources": {
    "MyExternalApi": {
      "Profile": "API",
      "Scopes": "a b c"
    }
  }
}

Kod aracılığıyla yapılandırma

İstemcileri ve kaynakları, seçenekleri yapılandırmak için bir eylem alan AddApiAuthorization aşırı yüklemesini kullanarak kod aracılığıyla da yapılandırabilirsiniz.

AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options =>
{
    options.Clients.AddSPA(
        "My SPA", spa =>
        spa.WithRedirectUri("http://www.example.com/authentication/login-callback")
           .WithLogoutRedirectUri(
               "http://www.example.com/authentication/logout-callback"));

    options.ApiResources.AddApiResource("MyExternalApi", resource =>
        resource.WithScopes("a", "b", "c"));
});

Ek kaynaklar