ASP.NET Core — Написание простой аутентификации JWT

Это простая реализация аутентификации JWT для начала работы.

  1. Добавьте пакет Microsoft.AspNetCore.Authentication.JwtBearer.
  2. Вам нужен секретный ключ, добавьте его с помощью user-secrets:

    dotnet user-secrets init
    dotnet user-secrets set "Authentication:JwtSecret" "thisismysecret"
    

    Внимание! User secrets не предназначен для использования в производстве.

  3. В вашем Program.cs или Startup.cs:

    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc.Authorization;
    using Microsoft.IdentityModel.Tokens;
    

    Добавьте службу:

    builder.Services
        .AddAuthentication()
        .AddJwtBearer("JwtScheme", options => {
            options.TokenValidationParameters = new TokenValidationParameters 
            {
                ValidIssuer = "https://localhost:<port>",
                ValidAudience = "https://localhost:<port>",
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,                
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Authentication:JwtSecret"])),
            };
    }) 
    

    Сообщите MVC, что пользователи должны быть аутентифицированы и с помощью JWTScheme.

    builder.Services.AddControllers(options => {
        options.Filters.Add(new AuthorizeFilter
            (new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes("JwtScheme")
                .Build()));
    })
    

    В конвейере HTTP-запросов добавьте контроллеры перед отображением:

    app.UseAuthentication();
    app.UseAuthorization();
    
  4. В вашем контроллере аутентификации:

    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    using System.Security.Claims;
    .
    .
    //inject `IConfiguration` to `_configuration` in the constructor.
    

    В метод входа добавьте атрибут [AllowAnonymous]. Затем:

    //validate credentials and get user details here
    var key = Encoding.ASCII.GetBytes(_configuration["Authentication:JwtSecret"]);
    var claims = new List<Claim>
        {
            new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Name, user.Username)
        };
    var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Issuer = "https://localhost:<port>",
            Audience = "https://localhost:<port>",
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
    
        };
    
    var tokenHandler = new JwtSecurityTokenHandler();
    var token = tokenHandler.CreateToken(tokenDescriptor);
    return tokenHandler.WriteToken(token);
    

    Метод входа в систему будет возвращать сгенерированный токен.

  5. В HTTP-запрос вашего клиента добавьте заголовок Authorize со значением Bearer <the token generated>. Вы можете протестировать его с помощью Postman или любой другой программы тестирования, которую вы предпочитаете.

Ресурс
Статья Infoworld — JWT
Microsoft Docs — Секреты пользователей

Оцените статью
devanswers.ru
Добавить комментарий