프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / ImageHandler / ImageHandler.cs @ master

이력 | 보기 | 이력해설 | 다운로드 (4.05 KB)

1 2b1f30fe taeseongkim
using Microsoft.IdentityModel.Tokens;
2
using System;
3
using System.Collections.Generic;
4
using System.IdentityModel.Tokens.Jwt;
5
using System.Linq;
6
using System.Net.Mime;
7
using System.Security.Claims;
8
using System.Text;
9
using System.Threading.Tasks;
10
using System.Web;
11
12
namespace Markus
13
{
14
    public class ImageHandler : IHttpHandler
15
    {
16
        public void ProcessRequest(HttpContext context)
17
        {
18
            System.Diagnostics.Debug.WriteLine(context.Request.Url.ToString());
19
20
            if (context.Request.Url.PathAndQuery.Replace("/", "") == "Authenticate")
21
            {
22
                if (context.Request.Headers["Authorization"] == "!dsfadsfa@@~")
23
                {
24
                    context.Response.ClearHeaders();
25
                    context.Response.ContentType = "text/json";
26
                    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
27
                    context.Response.Write(createToken());
28
                    context.Response.End();
29
                }
30
            }
31
            else
32
            {
33
                if (ValidateToken(context.Request.Headers["Authorization"]))
34
                {
35
                    string imagePath = context.Request.Url.AbsolutePath;
36
                    string physicalImagePath = context.Server.MapPath(imagePath);
37
                    context.Response.ContentType = GetContentType(System.IO.Path.GetExtension(physicalImagePath)); // 이미지의 형식에 따라 변경해야 할 수 있습니다.
38
                    context.Response.WriteFile(physicalImagePath);
39
                }
40
                else
41
                {
42
                    context.Response.StatusCode = 403; // 인증되지 않음 상태 코드
43
                }
44
            }
45
        }
46
47
        public string GetContentType(string fileExtension)
48
        {
49
            switch (fileExtension)
50
            {
51
                case ".jpg":
52
                    return "image/jpeg";
53
                case ".png":
54
                    return "image/png";
55
                case ".pdf":
56
                    return "application/pdf";
57
                default:
58
                    return "text/plain";
59
            }
60
61
            // 미디어 타입 상수 중 이미지 JPEG 타입을 사용합니다.
62
            
63
        }
64
65
        private string createToken()
66
        {
67
            var keydata = Encoding.ASCII.GetBytes(key);
68
69
            var claims = new Claim[] { new Claim(ClaimTypes.Name, "markus") };
70
71
            var securityTokenDescriptor = new SecurityTokenDescriptor()
72
            {
73
                Issuer = "markus",
74
                Audience = "Authenticate",
75
                Subject = new ClaimsIdentity(claims),
76
                Expires = DateTime.UtcNow.AddMinutes(30),
77
                SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(keydata), SecurityAlgorithms.HmacSha256Signature)
78
            };
79
80
            var tokenHandler = new JwtSecurityTokenHandler();
81
            var token = tokenHandler.CreateJwtSecurityToken(securityTokenDescriptor);
82
83
            return tokenHandler.WriteToken(token);
84
        }
85
86
        private bool ValidateToken(string value)
87
        {
88
            bool result = false;
89
            try
90
            {
91
                var tokenValidationParameters = new TokenValidationParameters
92
                {
93
                    ValidateIssuer = false, // 이 값은 실제로는 검증 규칙에 따라 다를 수 있습니다.
94
                    ValidateAudience = false,
95
                    ValidateLifetime = true,
96
                    IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.ASCII.GetBytes(key))
97
                };
98
99
                var claimsPrincipal = new JwtSecurityTokenHandler().ValidateToken(value, tokenValidationParameters, out var validatedToken);
100
                var claimsIdentity = claimsPrincipal.Identity as ClaimsIdentity;
101
                result = true;
102
            }
103
            catch (Exception)
104
            {
105
            }
106
107
            return result;
108
        }
109
110
        protected readonly string key = "795hi#(7qq5&p#f3ysa#n-449h8g_n95olca)b%t23s7!w%v0m";
111
112
        public bool IsReusable => false;
113
    }
114
}
클립보드 이미지 추가 (최대 크기: 500 MB)