0Pricing
C# Academy · Lekcja

Wystawianie tokenów

Generuj podpisane tokeny podczas logowania.

Wystawianie tokenów to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Wystawianie a weryfikacja

Do tej pory weryfikowano tokeny. Teraz będą one wystawiane: po pomyślnym zalogowaniu API tworzy podpisany token JWT i zwraca go.

Podstawowym typem służącym do tego celu jest JwtSecurityTokenHandler z przestrzeni nazw System.IdentityModel.Tokens.Jwt.

dotnet add package System.IdentityModel.Tokens.Jwt

Klucz podpisujący

Do podpisania tokenu potrzebny jest klucz. W przypadku HS256 należy użyć tego samego sekretu symetrycznego, którego używa weryfikator.

Sekretu nie należy przechowywać w systemie kontroli wersji — powinien być ładowany z konfiguracji lub magazynu sekretów.

var key = new SymmetricSecurityKey(
    Encoding.UTF8.GetBytes(configuration["Jwt:Key"]!));

SigningCredentials

SigningCredentials łączy klucz z algorytmem. W przypadku klucza symetrycznego należy użyć SecurityAlgorithms.HmacSha256.

var creds = new SigningCredentials(
    key,
    SecurityAlgorithms.HmacSha256);

Tworzenie claimów

Należy zdecydować, co umieścić w tokenie. Zawsze należy uwzględnić subject (identyfikator użytkownika) oraz role lub dane potrzebne danemu API.

Należy dodać unikatowy jti, aby można było zidentyfikować każdy token.

var claims = new List<Claim>
{
    new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
    new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
    new Claim(ClaimTypes.Name, user.UserName),
    new Claim(ClaimTypes.Role, user.Role)
};

Tworzenie JwtSecurityToken

JwtSecurityToken łączy wystawcę, odbiorcę, claime, termin wygaśnięcia i dane uwierzytelniające podpisu w jeden obiekt tokenu.

var token = new JwtSecurityToken(
    issuer: configuration["Jwt:Issuer"],
    audience: configuration["Jwt:Audience"],
    claims: claims,
    notBefore: DateTime.UtcNow,
    expires: DateTime.UtcNow.AddMinutes(15),
    signingCredentials: creds);

Serializacja do ciągu znaków

Przed wysłaniem do klienta obiekt tokenu musi zostać zapisany w zwartej postaci ciągu znaków header.payload.signature.

var handler = new JwtSecurityTokenHandler();
string jwt = handler.WriteToken(token);
// jwt now looks like eyJhbGciOiJI...

Usługa tokenów wielokrotnego użytku

Logikę należy opakować w usługę, aby kontrolery pozostały przejrzyste, a konfiguracja znajdowała się w jednym miejscu.

public class TokenService(IConfiguration config)
{
    public string CreateAccessToken(AppUser user)
    {
        var key = new SymmetricSecurityKey(
            Encoding.UTF8.GetBytes(config["Jwt:Key"]!));
        var creds = new SigningCredentials(
            key, SecurityAlgorithms.HmacSha256);
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
            new Claim(ClaimTypes.Role, user.Role)
        };
        var token = new JwtSecurityToken(
            config["Jwt:Issuer"], config["Jwt:Audience"],
            claims, expires: DateTime.UtcNow.AddMinutes(15),
            signingCredentials: creds);
        return new JwtSecurityTokenHandler().WriteToken(token);
    }
}

Podłączanie endpointu logowania

Endpoint logowania weryfikuje dane uwierzytelniające, następnie wywołuje usługę i zwraca token klientowi.

app.MapPost("/login", (LoginDto dto, TokenService tokens) =>
{
    var user = Authenticate(dto.Username, dto.Password);
    if (user is null) return Results.Unauthorized();
    return Results.Ok(new { accessToken = tokens.CreateAccessToken(user) });
});

Symetryczne a asymetryczne

HS256 używa jednego współdzielonego sekretu zarówno do podpisywania, jak i weryfikowania. RS256 używa klucza prywatnego do podpisywania i klucza publicznego do weryfikowania.

Podpisywanie asymetryczne umożliwia opublikowanie klucza publicznego, dzięki czemu inne usługi mogą weryfikować tokeny bez przechowywania sekretu podpisującego.

var creds = new SigningCredentials(
    new RsaSecurityKey(rsaPrivateKey),
    SecurityAlgorithms.RsaSha256);

Rejestrowanie usługi

Usługę tokenów należy dodać do mechanizmu wstrzykiwania zależności, aby można było wstrzykiwać ją do endpointów i kontrolerów.

builder.Services.AddScoped<TokenService>();

Zwięzłe i krótkotrwałe tokeny

Dwie dobre praktyki dotyczące wystawiania tokenów:

  • Zwięzłe: należy uwzględniać tylko claime potrzebne API — token jest przesyłany przy każdym żądaniu.
  • Krótkotrwałe: tokeny dostępu ważne od 5 do 15 minut ograniczają szkody w przypadku wycieku.
expires: DateTime.UtcNow.AddMinutes(15)

Szybkie sprawdzenie

Proszę sprawdzić swoją wiedzę na temat wystawiania tokenów.

Podsumowanie

Wystawiono podpisane tokeny JWT:

  • SigningCredentials łączy klucz z algorytmem.
  • Należy utworzyć listę obiektów Claimów, a następnie obiekt JwtSecurityToken z wystawcą, odbiorcą i terminem wygaśnięcia.
  • JwtSecurityTokenHandler.WriteToken serializuje go do zwartego ciągu znaków.
  • Tokeny powinny być zwięzłe i krótkotrwałe.

Następnie: tokeny odświeżające i strategie wygasania.

Często zadawane pytania

Czy lekcja „Wystawianie tokenów” jest bezpłatna?

Tak — pełny tekst „Wystawianie tokenów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wystawianie tokenów”?

Generuj podpisane tokeny podczas logowania. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wystawianie tokenów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Struktura JWT i deklaracje
  2. Konfigurowanie uwierzytelniania JWT Bearer
  3. Wystawianie tokenów
  4. Tokeny odświeżania i wygaśnięcie
← Powrót do C# Academy