C\#JWT 무상 태 검증 을 실현 하 는 실전 응용 분석
본 고 는 주로 JWT 의 실전 운용 을 소개 한다.
준비 작업
우선 MVC 와 WebApi 를 포함 한 Asp.Net 프로젝트 를 만 듭 니 다.
그리고 Nuget 을 사용 하여 JWT 를 검색 하고 JWT 라 이브 러 리 를 설치 합 니 다.다음 그림 입 니 다.
디자인 아이디어
여기 서 우 리 는 간단하게 token 검증 디자인 을 했 는데 디자인 방향 은 다음 과 같다.
코드 구현
캐 시
우선,우 리 는 먼저 도구 류 를 개발 하고 디자인 사고 도 에 따라 서버 에 token 을 저장 하 는 캐 시 류 가 필요 하 다 는 것 을 알 수 있 습 니 다.
캐 시 관련 코드 를 작성 하 는 것 은 다음 과 같 습 니 다.
public class CacheHelper
{
public static object GetCache(string key)
{
return HttpRuntime.Cache[key];
}
public static T GetCache<T>(string key) where T : class
{
return (T)HttpRuntime.Cache[key];
}
public static bool ContainsKey(string key)
{
return GetCache(key) != null;
}
public static void RemoveCache(string key)
{
HttpRuntime.Cache.Remove(key);
}
public static void SetKeyExpire(string key, TimeSpan expire)
{
object value = GetCache(key);
SetCache(key, value, expire);
}
public static void SetCache(string key, object value)
{
_SetCache(key, value, null, null);
}
public static void SetCache(string key, object value, TimeSpan timeout)
{
_SetCache(key, value, timeout, ExpireType.Absolute);
}
public static void SetCache(string key, object value, TimeSpan timeout, ExpireType expireType)
{
_SetCache(key, value, timeout, expireType);
}
private static void _SetCache(string key, object value, TimeSpan? timeout, ExpireType? expireType)
{
if (timeout == null)
HttpRuntime.Cache[key] = value;
else
{
if (expireType == ExpireType.Absolute)
{
DateTime endTime = DateTime.Now.AddTicks(timeout.Value.Ticks);
HttpRuntime.Cache.Insert(key, value, null, endTime, Cache.NoSlidingExpiration);
}
else
{
HttpRuntime.Cache.Insert(key, value, null, Cache.NoAbsoluteExpiration, timeout.Value);
}
}
}
}
/// <summary>
///
/// </summary>
public enum ExpireType
{
/// <summary>
///
/// :
/// </summary>
Absolute,
/// <summary>
///
/// : ,
/// </summary>
Relative,
}
위 코드 에서 보 듯 이 캐 시 도움말 클래스 인 CacheHelper 클래스 를 작 성 했 습 니 다.CacheHelper 클래스:HttpRuntime 의 캐 시 를 사용 합 니 다.클래스 에 서 는 캐 시 를 추가 로 삭제 합 니 다.HttpRuntime 을 사용 하기 때문에 캐 시 시간 초과 가 설정 되 어 있 지 않 으 면 캐 시 시간 초과 가 HttpRuntime.cache 설정 의 기본 시간 초과 와 같 습 니 다.
사이트 가 IIS 에 마 운 트 되면 HttpRuntime.cache 설정 시간 이 초과 되 는 곳 은 이 사이트 의 응용 프로그램 풀 에서 다음 과 같 습 니 다.
Jwt 도움말 클래스
현재 Jwt 도움말 클래스 를 작성 합 니 다.코드 는 다음 과 같 습 니 다.
public class JwtHelper
{
//
public const string secret = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNAmD7RTE2drj6hf3oZjJpMPZUQ1Qjb5H3K3PNwIDAQAB";
/// <summary>
/// <summary>
/// JwtToken
/// </summary>
/// <param name="payload"> </param>
/// <returns></returns>
public static string SetJwtEncode(string username,int expiresMinutes)
{
//
var payload = new Dictionary<string, object>
{
{ "username",username },
{ "exp ", expiresMinutes },
{ "domain", "" }
};
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
var token = encoder.Encode(payload, secret);
return token;
}
/// <summary>
/// jwtToken
/// </summary>
/// <param name="token">jwtToken</param>
/// <returns></returns>
public static IDictionary<string,object> GetJwtDecode(string token)
{
IJsonSerializer serializer = new JsonNetSerializer();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
var dicInfo = decoder.DecodeToObject(token, secret, verify: true);//token
return dicInfo;
}
}
코드 는 매우 간단 하여 JWT 의 Code 생 성과 해석 을 실현 했다.주:JWT 의 Code 는 비밀문서 이지 만 해석 할 수 있 기 때문에 우 리 는 Code 에 중요 한 정 보 를 저장 하지 않 습 니 다.예 를 들 어 비밀번호 등 입 니 다.
JWT 의 코드 와 해석 후의 내용 은 아래 그림 과 같이 왼쪽 에는 코드 가 없고 오른쪽 에는 해석 되 지 않 은 내용 입 니 다.
AuthenticationHelper 인증 도움말 클래스
이제 인증 클래스 를 만 들 수 있 습 니 다.방금 만 든 캐 시 도움말 클래스 와 JWT 도움말 클래스 를 이용 합 니 다.
AuthenticationHelper 인증 도움말 클래스 코드 는 다음 과 같 습 니 다.
public class AuthenticationHelper
{
/// <summary>
/// 30
/// </summary>
/// <param name="username"></param>
public static void AddUserAuth(string username)
{
var token = JwtHelper.SetJwtEncode(username, 30);
CacheHelper.SetCache(username, token, new TimeSpan(TimeSpan.TicksPerHour / 2));
}
public static void AddUserAuth(string username, TimeSpan ts)
{
var token = JwtHelper.SetJwtEncode(username, ts.Minutes);
CacheHelper.SetCache(username, token, ts);
}
public static string GetToken(string username)
{
var cachetoken = CacheHelper.GetCache(username);
return cachetoken.ParseToString();
}
public static bool CheckAuth(string token)
{
var dicInfo = JwtHelper.GetJwtDecode(token);
var username = dicInfo["username"];
var cachetoken = CacheHelper.GetCache(username.ToString());
if (!cachetoken.IsNullOrEmpty() && cachetoken.ToString() == token)
{
return true;
}
else
{
return false;
}
}
}
코드 에서 보 듯 이 저 희 는 token 생 성 검증,token 획득 검증,Token 검증 세 가지 방법 을 실 현 했 습 니 다.이 곳 에서 우리 의 기본 코드 는 이미 작성 되 었 습 니 다.다음은 검 증 된 응용 프로그램 에 들 어 갑 니 다.
Fliter
우선,Global.asax 파일 에 WebApi 에 필 터 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
//webapiFilter
System.Web.Http.GlobalConfiguration.Configuration.Filters.Add(new HttpPermissionFilter());
System.Web.Http.GlobalConfiguration.Configuration.Filters.Add(new HttpExceptionFilter());
//mvcFliter
System.Web.Mvc.GlobalFilters.Filters.Add(new MvcExceptionFilter());
System.Web.Mvc.GlobalFilters.Filters.Add(new MvcPermissionFilter());
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
코드 에 MVC 요청 과 이상 필터,WebApi 요청 과 이상 필터 등 네 개의 필 터 를 만 들 었 습 니 다.여기 서 우 리 는 주로 WebApi 의 요청 필 터 를 본다.HttpPermission Filter.코드 는 다음 과 같 습 니 다:
public class HttpPermissionFilter : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
string url =" Url" + actionContext.Request.RequestUri.ToString();
var action = actionContext.ActionDescriptor.ActionName.ToLower();
var controller = actionContext.ControllerContext.ControllerDescriptor.ControllerName.ToLower();
if (controller != "login" && controller != "loginout")
{
// token
var token = actionContext.Request.Headers.Authorization != null ? actionContext.Request.Headers.Authorization.ToString() : "";
// token token
if (!token.IsNullOrEmpty() && AuthenticationHelper.CheckAuth(token))
{
// ,
}
else
{
throw new Exception("Token ");
}
}
}
}
우리 의 Http Permission Filter 류 는 System.Web.Http.Filters.Action FilterAttribute 를 계승 하여 모든 WebApi 요청 을 차단 할 수 있 습 니 다.그 다음 에 우 리 는 그의 OnAction Executing 방법 을 다시 썼 습 니 다.방법 에서 우 리 는 현재 요청 한 Controller 의 이름 을 조회 한 다음 에 간단 한 판단 을 했 습 니 다.만약 에 login(로그 인)이나 loginout(로그 인)이 라면 우 리 는 그의 token 에 대해 검증 하지 않 을 것 입 니 다.다른 요청 이 있 으 면 요청 한 Headers 의 Authorization 속성 에서 token 을 읽 고 AuthenticationHelper 클래스 를 사용 하여 이 token 을 정확하게 검증 합 니 다.
WebApi 인터페이스
지금 우 리 는 WebApi 인 터 페 이 스 를 만 들 고 로그 인 인터페이스 와 일반 요청 인 터 페 이 스 를 만 듭 니 다.
로그 인 인터페이스:AuthenticationHelper 클래스 를 사용 하여 token 을 만 들 고 캐 시 에 저장 합 니 다.
그리고 토 큰 을 호출 자 에 게 되 돌려 줍 니 다.
일반 인터페이스:여기 서 우 리 는 어떠한 조작 도 하지 않 고 간단하게 성공 으로 돌아 가 는 것 입 니 다.이 인터페이스 에 접근 할 수 있 는 지,이미 Filter 가 제어 하고 있 기 때 문 입 니 다.
코드 는 다음 과 같 습 니 다:
public class LoginController : ApiController
{
public string Get(string username,string pwd)
{
AuthenticationHelper.AddUserAuth(username, new TimeSpan(TimeSpan.TicksPerMinute * 5));//5
string token = AuthenticationHelper.GetToken(username);
return token;
}
}
public class RequestController : ApiController
{
public string Get()
{
return " ";
}
}
테스트 페이지현재 테스트 페이지 를 작성 합 니 다.로그 인,token 을 가지 고 Api 에 접근 하고,token 이 없 으 면 Api 에 접근 하 는 세 가지 단 추 를 실행 합 니 다.
코드 는 다음 과 같 습 니 다:
<div>
<script>
$(document).ready(function () {
$("#request").click(function () {
var token = window.localStorage.getItem('token');
if (token) {
$.ajax({
type: "GET",
url: "http://localhost:50525/api/Request",
success: function (data) {
$('#con').append('<div> success:' + data + '</div>');
console.log(data);
},
beforeSend: function (xhr) {
// Header Authirization
xhr.setRequestHeader("Authorization", token);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$('#con').append('<div> error:' + errorThrown + '</div>');
}
});
}
else {
alert("token ");
}
});
$("#requestNotoken").click(function () {
var token = window.localStorage.getItem('token');
if (token) {
$.ajax({
type: "GET",
url: "http://localhost:50525/api/Request",
success: function (data) {
$('#con').append('<div> success:' + data + '</div>');
console.log(data);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$('#con').append('<div> error:' + errorThrown + '</div>');
}
});
}
else {
alert("token ");
}
});
$("#login").click(function () {
$.ajax({
type: "GET",
url: "http://localhost:50525/api/Login/?username=kiba&pwd=518",
success: function (data) {
$('#con').append('<div> token:' + data + '</div>');
console.log(data);
window.localStorage.setItem('token', data)
}
});
});
});
</script>
<h1> JWT</h1>
<button id="login"> </button>
<button id="request"> token Api</button>
<button id="requestNotoken"> token Api</button>
<div id="con"></div>
</div>
테스트 결 과 는 다음 과 같다.위의 그림 에서 보 듯 이 우 리 는 간단 한 token 검증 을 성공 적 으로 실현 했다.
이로써 JWT 의 실전 애플 리 케 이 션 은 이미 소개 됐다.
코드 가 Github 에 전송 되 었 습 니 다.다운로드 환영 합 니 다.
Github 주소:https://github.com/kiba518/JwtNet
C\#JWT 무상 태 검증 을 실현 하 는 실전 응용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#JWT 무상 태 검증 을 실현 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.