반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Yes
- 머신러닝
- 컴퓨터공학
- 파이썬
- 네트워크보안
- 데이터베이스
- 데이터분석
- 사이버보안
- 소프트웨어
- 인공지능
- 네트워크
- 프로그래밍
- 소프트웨어공학
- 데이터과학
- 컴퓨터비전
- 데이터구조
- 2
- 빅데이터
- 알고리즘
- 딥러닝
- I'm Sorry
- 자료구조
- 컴퓨터과학
- 클라우드컴퓨팅
- 코딩
- 웹개발
- 보안
- 버전관리
- 프로그래밍언어
- 자바스크립트
Archives
- Today
- Total
스택큐힙리스트
JWT on .NET Core 2.0 본문
반응형
이상한 점 중 하나는 토큰이 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
AuthRequest.cs : 로그인 및 비밀번호를 전달하기 위해 값을 유지하는 Dto
public class AuthRequest
{
public string UserName { get; set; }
public string Password { get; set; }
}Startup.cs의 Configure() 메서드에서 app.UseMvc() 이전에 :
app.UseAuthentication();
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]))
};
});컨트롤러 추가:
[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(토큰을 생성할 수 없습니다.);
}}
이게 다입니다! 건배!
업데이트: 사람들이 현재 사용자를 어떻게 얻을 수 있는지라고 묻습니다. 할 일:
Startup.cs의 ConfigureServices()에 다음을 추가합니다.
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
컨트롤러에 생성자에 다음을 추가합니다:
private readonly int _currentUser;
public MyController(IHttpContextAccessor httpContextAccessor)
{
_currentUser = httpContextAccessor.CurrentUser();
}어딘가에 확장 메서드를 추가하고 컨트롤러에서 이를 사용합니다 (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