스택큐힙리스트

JWT on .NET Core 2.0 본문

카테고리 없음

JWT on .NET Core 2.0

스택큐힙리스트 2023. 12. 5. 00:21
반응형

이상한 점 중 하나는 토큰이 HS256 알고리즘으로 암호화되었지만, 강제로 해당 알고리즘을 사용하라는 표시가 보이지 않는다는 것입니다.


지금까지 작성한 클래스는 다음과 같습니다:

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using Newtonsoft.Json.Linq;
using Microsoft.IdentityModel.Tokens;
using System.Text;
namespace Site.Authorization
{
public static class SiteAuthorizationExtensions
{
public static IServiceCollection AddSiteAuthorization(this IServiceCollection services)
{
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(SECRET_KEY));
var tokenValidationParameters = new TokenValidationParameters
{
// The signing key must match!
ValidateIssuerSigningKey = true,
ValidateAudience = false,
ValidateIssuer = false,
IssuerSigningKeys = new List<SecurityKey>{ signingKey },
// Validate the token expiry
ValidateLifetime = true,
};
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(o =>
{
o.IncludeErrorDetails = true;
o.TokenValidationParameters = tokenValidationParameters;
o.Events = new JwtBearerEvents()
{
OnAuthenticationFailed = c =>
{
c.NoResult();
c.Response.StatusCode = 401;
c.Response.ContentType = text/plain;
return c.Response.WriteAsync(c.Exception.ToString());
}
};
});
return services;
}
}
}

답변 1


  1. AuthRequest.cs : 로그인 및 비밀번호를 전달하기 위해 값을 유지하는 Dto


    public class AuthRequest
    {
    public string UserName { get; set; }
    public string Password { get; set; }
    }

  2. Startup.cs의 Configure() 메서드에서 app.UseMvc() 이전에 :


    app.UseAuthentication();

  3. Startup.cs의 ConfigureServices() :


    services.AddAuthentication()
    .AddJwtBearer(cfg =>
    {
    cfg.RequireHttpsMetadata = false;
    cfg.SaveToken = true;
    cfg.TokenValidationParameters = new TokenValidationParameters()
    {
    ValidIssuer = Configuration[Tokens:Issuer],
    ValidAudience = Configuration[Tokens:Issuer],
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration[Tokens:Key]))
    };
    });

  4. 컨트롤러 추가:


        [Route(api/[controller])]
    public class TokenController : Controller
    {
    private readonly IConfiguration _config;
    private readonly IUserManager _userManager;
    public TokenController(IConfiguration configuration, IUserManager userManager)
    {
    _config = configuration;
    _userManager = userManager;
    }
    [HttpPost()]
    [AllowAnonymous]
    public IActionResult Login([FromBody] AuthRequest authUserRequest)
    {
    var user = _userManager.FindByEmail(model.UserName);
    if (user != null)
    {
    var checkPwd = _signInManager.CheckPasswordSignIn(user, model.authUserRequest);
    if (checkPwd)
    {
    var claims = new[]
    {
    new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
    new Claim(JwtRegisteredClaimNames.Jti, user.Id.ToString()),
    };
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config[Tokens:Key]));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var token = new JwtSecurityToken(_config[Tokens:Issuer],
    _config[Tokens:Issuer],
    claims,
    expires: DateTime.Now.AddMinutes(30),
    signingCredentials: creds);
    return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
    }
    }
    return BadRequest(토큰을 생성할 수 없습니다.);
    }}

이게 다입니다! 건배!


업데이트: 사람들이 현재 사용자를 어떻게 얻을 수 있는지라고 묻습니다. 할 일:



  1. Startup.cs의 ConfigureServices()에 다음을 추가합니다.


    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

  2. 컨트롤러에 생성자에 다음을 추가합니다:


    private readonly int _currentUser;
    public MyController(IHttpContextAccessor httpContextAccessor)
    {
    _currentUser = httpContextAccessor.CurrentUser();
    }

  3. 어딘가에 확장 메서드를 추가하고 컨트롤러에서 이를 사용합니다 (using ....)


    public static class IHttpContextAccessorExtension
    {
    public static int CurrentUser(this IHttpContextAccessor httpContextAccessor)
    {
    var stringId = httpContextAccessor?.HttpContext?.User?.FindFirst(JwtRegisteredClaimNames.Jti)?.Value;
    int.TryParse(stringId ?? 0, out int userId);
    return userId;
    }
    }

답변 2

JWT는 JSON Web Token의 약어로서, 인증 및 인증용 토큰으로 사용되는 인증 프로토콜입니다. 이 프로토콜은 웹 응용 프로그램 및 API에서 사용되며, 사용자 인증 및 권한 부여를 처리하는 데 도움이 됩니다.
.NET Core 2.0에서는 JWT를 간편하게 구현할 수 있습니다. 닷넷 코어는 여러 플랫폼과 언어에서 사용 가능하며, 높은 수준의 보안 기능과 뛰어난 성능을 제공합니다. 따라서 JWT를 구현하기 위해 .NET Core 2.0을 선택하는 것은 현명한 선택입니다.
JWT는 세 가지 부분으로 구성됩니다. 헤더, 페이로드 및 서명입니다. 헤더는 토큰에 대한 메타 데이터를 제공하고, 페이로드는 사용자에 대한 정보를 포함합니다. 서명은 토큰의 유효성을 검증하는 데 사용됩니다.
.NET Core 2.0에서 JWT를 구현하기 위해서는 NuGet 패키지 매니저를 사용하여 필요한 패키지를 설치해야 합니다. 이 패키지는 JWT 토큰을 생성하고 검증하기 위한 필요한 기능을 제공합니다.
JWT는 일반적으로 사용자가 로그인하거나 인증을 요청할 때 생성됩니다. 서버는 사용자의 정보를 확인하고 JWT를 발급하여 클라이언트에게 제공합니다. 클라이언트는 이 토큰을 이후의 API 요청에 대한 인증 수단으로 사용할 수 있습니다. 이러한 방식으로 JWT는 사용자 인증을 보다 효율적이고 안전하게 처리할 수 있습니다.
또한 JWT는 유효 기간을 설정할 수 있기 때문에, 일정 시간이 지난 후에는 자동으로 만료되어야 합니다. 이러한 만료 기간은 보안을 강화하고 토큰의 무단 사용을 방지하는 데 도움이 됩니다.
JWT는 닷넷 코어 2.0에서 쉽게 구현할 수 있는 강력한 보안 기술입니다. 이 프로토콜을 사용하여 웹 응용 프로그램과 API의 보안 수준을 향상시킬 수 있습니다. 또한 .NET Core의 뛰어난 성능과 다른 플랫폼과의 호환성은 개발 과정에서 높은 생산성을 보장합니다.
이러한 이유로, .NET Core 2.0에서 JWT를 사용하는 것은 웹 응용 프로그램 및 API의 보안을 강화하고 개발 과정을 최적화하는 데 매우 유용한 선택입니다. .NET Core의 높은 성능과 JWT의 유연성을 결합하여 탁월한 결과를 얻을 수 있습니다.

반응형
Comments