첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.

728x90
반응형
728x170

※ JWT 기본 개념을 이해하기 위한 소스 코드이다.

 

TestProject.zip
다운로드

▶ ConstantHelper.cs

namespace TestProject
{
    /// <summary>
    /// 상수 헬퍼
    /// </summary>
    public class ConstantHelper
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region Field

        /// <summary>
        /// 발행자
        /// </summary>
        public const string Issuer = "https://localhost:44306/";

        /// <summary>
        /// 청중
        /// </summary>
        public const string Audiance = "https://localhost:44306/";

        /// <summary>
        /// 패스워드
        /// </summary>
        public const string Password = "not_too_short_secret_otherwise_it_might_error";

        #endregion
    }
}

※ Issuer, Audiance, Password 필드 값은 적절히 수정한다.

 

728x90

 

▶ Startup.cs

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.Threading.Tasks;

namespace TestProject
{
    /// <summary>
    /// 시작
    /// </summary>
    public class Startup
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 서비스 컬렉션 구성하기 - ConfigureServices(services)

        /// <summary>
        /// 서비스 컬렉션 구성하기
        /// </summary>
        /// <param name="services">서비스 컬렉션</param>
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication("OAuth")
                .AddJwtBearer
                (
                    "OAuth",
                    options =>
                    {
                        byte[] passwordByteArray = Encoding.UTF8.GetBytes(ConstantHelper.Password);

                        SymmetricSecurityKey key = new SymmetricSecurityKey(passwordByteArray);

                        // GET 방식으로 access_token 값에 JWT를 전달할 수 있게 해준다.
                        options.Events = new JwtBearerEvents()
                        {
                            OnMessageReceived = context =>
                            {
                                if(context.Request.Query.ContainsKey("access_token"))
                                {
                                    context.Token = context.Request.Query["access_token"];
                                }

                                return Task.CompletedTask;
                            }
                        };

                        options.TokenValidationParameters = new TokenValidationParameters()
                        {
                            ValidIssuer      = ConstantHelper.Issuer,
                            ValidAudience    = ConstantHelper.Audiance,
                            IssuerSigningKey = key
                        };
                    }
                );

            services.AddControllersWithViews();
        }

        #endregion
        #region 구성하기 - Configure(app, environment)

        /// <summary>
        /// 구성하기
        /// </summary>
        /// <param name="app">애플리케이션 빌더</param>
        /// <param name="environment">웹 호스트 환경</param>
        public void Configure(IApplicationBuilder app, IWebHostEnvironment environment)
        {
            if(environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseAuthentication();

            app.UseAuthorization();

            app.UseEndpoints
            (
                endpoints =>
                {
                    endpoints.MapDefaultControllerRoute();
                }
            );
        }

        #endregion
    }
}

 

▶ Controllers/HomeController.cs

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace TestProject.Controllers
{
    /// <summary>
    /// 홈 컨트롤러
    /// </summary>
    public class HomeController : Controller
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 인덱스 페이지 처리하기 - Index()

        /// <summary>
        /// 인덱스 페이지 처리하기
        /// </summary>
        /// <returns>액션 결과</returns>
        public IActionResult Index()
        {
            return View();
        }

        #endregion
        #region 인증 페이지 처리하기 - Authenticate()

        /// <summary>
        /// 인증 페이지 처리하기
        /// </summary>
        /// <returns>액션 결과</returns>
        public IActionResult Authenticate()
        {
            List<Claim> claimList = new List<Claim>
            {
                new Claim(JwtRegisteredClaimNames.Sub      , "ID0001"       ),
                new Claim(JwtRegisteredClaimNames.Birthdate, "2020-01-01"   ),
                new Claim(JwtRegisteredClaimNames.Email    , "test@daum.net"),
                new Claim(JwtRegisteredClaimNames.Gender   , "Male"         )
            };

            byte[] passwordByteArray = Encoding.UTF8.GetBytes(ConstantHelper.Password);

            SymmetricSecurityKey key = new SymmetricSecurityKey(passwordByteArray);

            string algorithm = SecurityAlgorithms.HmacSha256;

            SigningCredentials signingCredentials = new SigningCredentials(key, algorithm);

            JwtSecurityToken token = new JwtSecurityToken
            (
                ConstantHelper.Issuer,
                ConstantHelper.Audiance,
                claimList,
                notBefore : DateTime.Now,
                expires : DateTime.Now.AddHours(1),
                signingCredentials
            );

            string jwt = new JwtSecurityTokenHandler().WriteToken(token);

            return Ok(new { access_token = jwt });
        }

        #endregion
        #region 비밀 페이지 처리하기 - Secret()

        /// <summary>
        /// 비밀 페이지 처리하기
        /// </summary>
        /// <returns>액션 결과</returns>
        [Authorize]
        public IActionResult Secret()
        {
            return View();
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)

'C# > ASP.NET MVC' 카테고리의 다른 글

[C#/ASP.NET MVC] StatusCodePagesExtensions 클래스 : UseStatusCodePagesWithReExecute 확장 메소드를 사용해 대체 경로로 다시 요청을 실행하는 상태 코드 페이지 미들웨어 추가하기  (0) 2020.11.01
[C#/ASP.NET MVC] StatusCodePagesExtensions 클래스 : UseStatusCodePagesWithRedirects 확장 메소드를 사용해 지정된 URL로 재전송하는 상태 코드 페이지 미들웨어 추가하기  (0) 2020.11.01
[C#/ASP.NET MVC] StatusCodePagesExtensions 클래스 : UseStatusCodePages 확장 메소드에서 형식 문자열 사용하기  (0) 2020.11.01
[C#/ASP.NET MVC] ExceptionHandlerExtensions 클래스 : UseExceptionHandler 확장 메소드에서 예외 처리기 람다식 사용하기  (0) 2020.10.31
[C#/ASP.NET MVC] IExceptionHandlerPathFeature 인터페이스 : 오류 처리기 컨트롤러 또는 페이지에서 예외 및 요청 경로 구하기  (0) 2020.10.31
[C#/ASP.NET MVC] JWT(Json Web Token) 인증 사용하기  (0) 2020.10.31
[C#/ASP.NET MVC] 누겟 설치 : Microsoft.AspNetCore.Authentication.JwtBearer  (0) 2020.10.31
[C#/ASP.NET MVC] ExceptionHandlerExtensions 클래스 : UseExceptionHandler 확장 메소드를 사용해 예외 처리기 페이지 미들웨어 추가하기  (0) 2020.10.31
[C#/ASP.NET MVC] 인라인 미들웨어 성능 측정하기  (0) 2020.10.31
[C#/ASP.NET MVC] 인라인 미들웨어 성능 측정하기  (0) 2020.10.31
[C#/ASP.NET MVC] UrlHelperExtensions 클래스 : Page 확장 메소드를 사용해 절대 경로를 갖는 URL 구하기  (0) 2020.10.30
Posted by icodebroker

댓글을 달아 주세요