markus / ImageHandler / ImageHandler.cs @ 5532bcc0
이력 | 보기 | 이력해설 | 다운로드 (4.05 KB)
1 |
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 |
} |