c\#JWT 크로스 도 메 인 인증 실현 코드

JSON Web Token(JWT)은 현재 가장 유행 하 는 크로스 오 버 인증 솔 루 션 이다.네트워크 응용 환경 간 성명 전달 을 위 한 JSON 기반 개발 기준(RFC 7519)
이 token 은 치밀 하고 안전 하 며 분포 식 사이트 의 단일 로그 인(SSO)장면 에 특히 적합 하도록 설계 되 었 다.JWT 의 성명 은 일반적으로 신분 제공 자 와 서비스 제공 자 간 에 인 증 된 사용자 신분 정 보 를 전달 하 는 데 사용 된다.
자원 서버 에서 자원 을 가 져 올 수 있 도록 이 token 도 인증 에 직접 사용 할 수 있 고 암호 화 될 수 있 습 니 다.
1.JWT 의 구성
다음은 JWT 의 예제 로 머리(header),부하(payload)},비자(signature)세 부분 으로 나 뉘 는데 그들 사 이 는 점 으로 분리 된다.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiLmtYHmnIjml6Dlj4wiLCJleHAiOjE1NzExMDIxNTMsInN1YiI6InRlc3RKV1QiLCJhdWQiOiJVU0VSIiwiaWF0IjoiMjAxOS8xMC8xNSA5OjE1OjQzIiwiZGF0YSI6eyJuYW1lIjoiMTExIiwiYWdlIjoxMSwiYWRkcmVzcyI6Imh1YmVpIn19.
25IbZpAbSXBQsr2k3h0IzKRAC6z3OJTWg38VDtcEER8
2.전통 세 션 과 의 비교
JWT 는 json 의 인증 체 제 를 바탕 으로 하 는 것 이 고 상태 가 없 으 며 서버 측은 전통 적 으로 클 라 이언 트 의 로그 인 정 보 를 저장 하지 않 아서 분포 식 개발 에 편 의 를 제공 합 니 다.
전통 적 인 방식 은 서버 에서 session 정 보 를 저장 하 는 것 이기 때문에 session 은 메모리 에 저 장 됩 니 다.고객 의 양 이 커지 면 서버 에 대한 압력 이 자연히 커 집 니 다.
가장 중요 한 것 은 클 러 스 터 분포 식 에서 로그 인 할 때마다 서버 가 다 를 수 있 습 니 다.그러면 session 은 그 중의 한 서버 에 저장 되 고 다른 서버 는 요청 되 었 을 수 있 습 니 다.
때 는 무 상태 입 니 다.다시 로그 인 하지 않 으 면 큰 문제 가 발생 합 니 다.세 션 을 전문 서버 에 저장 하고 매번 그 서버 에 가서 요청 하 는 사람 도 있 습 니 다.
나 는 이것 이 좋 은 해결 방안 이 라 고 생각 하지 않 는 다.원래 군집 은 높 은 사용 을 위 한 것 이다.만약 에 session 을 설정 한 서버 가 고장 나 면 모두 가 따라 망 하기 때문에 JWT 라 는 무 상태 방식 이다.
이런 분포 식 시스템 에 매우 적합 하 다.
3.코드 JwtHelper
가짜 무술 을 연습 하지 않 는 다 고 만 말 하고,다음은 코드 를 한 단락 하 자.
아니면 옛날 방식 입 니까?먼저 NuGet 으로 JWT 를 인용 합 니 다.여 기 는 JWT 와 new tonsoft.json 을 도입 해 야 합 니 다.
다음 그림 에서 보 듯 이:

그리고 JWT 를 만 드 는 방법.

static IJwtAlgorithm algorithm = new HMACSHA256Algorithm();//HMACSHA256  
 static IJsonSerializer serializer = new JsonNetSerializer();//       
 static IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();//Base64   
 static IDateTimeProvider provider = new UtcDateTimeProvider();//UTC    
const string secret = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4aKpVo2OHXPwb1R7duLgg";//   
public static string CreateJWT(Dictionary<string, object> payload)
{
      IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
      return encoder.Encode(payload, secret);
}
이 코드 를 보고 어떻게 이렇게 간단 하 다 고 생각 하 십 니까?맞습니다.바로 이렇게 간단 합 니 다.이 방법 은 우리 가 인용 한 이 JWT 에 의 해 봉인 되 었 기 때문에 매우 간단 해 보 입 니 다.
그때 나 는 이곳 을 보고 약간 놀 랐 지만,나 는 소스 코드 에 대해 연 구 를 진행 하 였 는데,아래 에 소스 코드 를 붙 여 모두 에 게 보 여 주 었 다.
다음 과 같이 이 코드 는 비교적 핵심 적 인 코드 입 니 다.header 를 전달 하지 않 았 을 때 그 는 기본적으로 header 를 추가 해 주 었 습 니 다.
사실 아래 의 이 코드 는 쉽게 알 아 볼 수 있 습 니 다.header 와 payload 를 base 64 암호 화 하 는 것 이 아 닙 니 다.
여기 헤 더 는 니 가 직접 전달 할 수 있어.

public string Encode(IDictionary<string, object> extraHeaders, object payload, byte[] key)
    {
      if (payload is null)
        throw new ArgumentNullException(nameof(payload));

      var segments = new List<string>(3);

      var header = extraHeaders is null ? new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase) : new Dictionary<string, object>(extraHeaders, StringComparer.OrdinalIgnoreCase);
      header.Add("typ", "JWT");
      header.Add("alg", _algorithm.Name);

      var headerBytes = GetBytes(_jsonSerializer.Serialize(header));
      var payloadBytes = GetBytes(_jsonSerializer.Serialize(payload));

      segments.Add(_urlEncoder.Encode(headerBytes));
      segments.Add(_urlEncoder.Encode(payloadBytes));

      var stringToSign = String.Join(".", segments.ToArray());
      var bytesToSign = GetBytes(stringToSign);

      var signature = _algorithm.Sign(key, bytesToSign);
      segments.Add(_urlEncoder.Encode(signature));

      return String.Join(".", segments.ToArray());
    }
다음 단락 은 바로 JWT 를 검증 하 는 코드 입 니 다.여기 서 쓰 는 방법 이 많 지 않 습 니 다.어차피 JWT 안의 방법 을 호출 하 는 것 이 니 저희 가 파 라 메 터 를 전달 하면 됩 니 다.

public static bool ValidateJWT(string token, out string payload, out string message)
    {
      bool isValidted = false;
      payload = "";
      try
      {
        IJwtValidator validator = new JwtValidator(serializer, provider);//    JWT  

        IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder);//    JWT  
        payload = decoder.Decode(token, secret, verify: true);

        isValidted = true;

        message = "    ";
      }
      catch (TokenExpiredException)//            (    exp),   Token    
      {
        message = "   !";
      }
      catch (SignatureVerificationException)//       ,        
      {
        message = "    !";
      }
      return isValidted;
    }
호출

class Program
  {
    static void Main(string[] args)
    {
      //  (payload)
      var payload = new Dictionary<string, object>
      {
        { "iss","    "},//   
        { "exp", DateTimeOffset.UtcNow.AddSeconds(10).ToUnixTimeSeconds() },//    
        { "sub", "testJWT" }, //  
        { "aud", "USER" }, //  
        { "iat", DateTime.Now.ToString() }, //     
        { "data" ,new { name="111",age=11,address="hubei"} }
      };
      //  JWT
      Console.WriteLine("******************  JWT*******************");
      string JWTString = JwtHelper.CreateJWT(payload);
      Console.WriteLine(JWTString);
      Console.WriteLine();

      //  JWT
      Console.WriteLine("*******************  JWT,    ***************");
      string ResultMessage;//       
      string Payload;//    
      if (JwtHelper.ValidateJWT(JWTString, out Payload, out ResultMessage))
      {
        Console.WriteLine(Payload);
      }
      Console.WriteLine(ResultMessage);//      
      Console.WriteLine("*******************END*************************");
    }
  }
결 과 는 그림 과 같다.

총화
1.json 은 통용 되 기 때문에 jwt 는 대부분의 플랫폼 에서 통용 할 수 있 습 니 다.예 를 들 어 자바,python,phop,.net 등 입 니 다.
2.jwt 는 무 상태 이 고 jwt 는 분포 식 등 현재 유행 하 는 일부 프레임 워 크 에 사용 할 수 있 습 니 다.
3.jwt 자체 가 암호 화 된 것 이 아니 기 때문에 안전성 이 높 지 않 습 니 다.다른 사람 이 당신 의 token 을 알 면 해석 할 수 있 습 니 다.
물론 jwt 를 암호 화 할 수 있 습 니 다.설정 한 만 료 시간 이 너무 길 어 서 는 안 되 며 비밀번호 와 같은 중요 한 정 보 를 저장 하지 마 십시오.
4.https 를 최대한 사용 하 는 것 도 안전 을 위해 서 입 니 다.
5.JWT 바이트 의 점용 이 적 고 매우 가 벼 워 서 전송 하기에 편리 합 니 다.
6.JWT 는 보통 http 의 머리 헤더 에 넣 어 전송 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기