c\#JWT 크로스 도 메 인 인증 실현 코드
이 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 의 머리 헤더 에 넣 어 전송 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.