C\#JWT 무상 태 검증 을 실현 하 는 실전 응용 분석

13218 단어 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 무상 태 검증 을 실현 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기