ASP.NET Core 학습 의 사용 JWT 인증 권한 부여 상세 설명

개술
인증 권한 수 여 는 많은 시스템 의 기본 적 인 기능 입 니 다.예전 에 PC 시대 에 쿠키-session 과 같은 방식 으로 인증 권한 수 여 를 실 현 했 습 니 다.그 때 는 시스템 의 사용자 수가 많 지 않 았 기 때문에 이런 방식 도 잘 작 동 되 었 습 니 다.현재 소프트웨어 사용자 수가 점점 많아 지면 서시스템 구조 도 이전 수직 확장(서버 성능 증가)->수평 확장(서버 수 증가)
cookies-session 작업 방식
클 라 이언 트 가 사용자 정 보 를 제출 합 니 다->서버 식별 사용자->서버 에서 사용자 정 보 를 저장 합 니 다->session-id 클 라 이언 트 로 돌아 갑 니 다->클 라 이언 트 가 session-id 를 저장 합 니 다->요청 할 때마다 cookies 에 session-id 를 가 져 옵 니 다
이 방식 도 수평 으로 확장 할 수 없 는 것 이 아니다.예 를 들 어 session 복사/제3자 저장 session(데이터베이스,Redis)
명사 해석
인증:사용자 의 합 법 여 부 를 식별 합 니 다.
권한 부여:사용자 권한 부여(어떤 자원 에 접근 할 수 있 는 지)
감 권:감정 권한 이 합 법 적 인지 여부
Jwt 우세 와 열세
우세 하 다.
무상 태
token 은 인증 모든 정 보 를 저장 합 니 다.서버 는 사용자 인증 정 보 를 저장 하지 않 아 도 됩 니 다.서버 의 압력 을 줄 이 고 서버 가 수평 으로 확장 되 기 쉽 습 니 다.상태 가 없 으 면 최대 단점 을 초래 하여 로그아웃 하기 어렵 습 니 다.
2.크로스 도 메 인 접근 지원
Cookie 는 도 메 인 접근 을 허용 하지 않 습 니 다.token 지원
3.언어 간
표준 화 된 JSON Web Token(JWT)을 기반 으로 특정한 언어 에 의존 하지 않 습 니 다.예 를 들 어 Token 을 생 성하 면 여러 언어 에 사용 할 수 있 습 니 다(Net,Java,PHP...)
열세
1.Token 의 유효성 문제
백 스테이지 에서 발 표 된 Token 을 로그아웃 하기 어렵 습 니 다.보통 제3자 저장(데이터베이스/캐 시)을 통 해 로그아웃 을 해 야 합 니 다.그러면 JWT 의 가장 큰 장점 을 잃 게 됩 니 다.
2.대역 폭 차지
Token 길이(저장 내용 에 따라 다 름)비 sessionid 가 크 고 매번 요청 할 때마다 대역 폭 을 많이 소모 합 니 다.token 은 필요 한 정보 만 저장 하고 token 이 너무 길 지 않도록 합 니 다.
3.재계약 이 필요 하 다
cookies-session 은 보통 프레임 워 크 가 재계약 기능 을 실 현 했 습 니 다.매번 에 방문 할 때마다 기한 이 지난 시간 을 갱신 하고 JWT 는 스스로 실현 해 야 합 니 다.OAuth 2 리 셋 Token 체 제 를 참고 하여 리 셋 Token 을 실현 합 니 다.
4、더 많은 CPU 소모
매번 요청 할 때마다 내용 복호화 와 서명 검증 두 단계 작업 이 필요 합 니 다.전형 적 으로 시간 으로 공간 을 바 꿉 니 다.
자신의 사용 장면 에 따라 어떤 인증 방안 을 사용 할 지 결정 할 수 있 을 뿐 통용 되 고 완벽 한 방안 은 없다.
AspNetCore 통합 Jwt 인증
1.가방 추가

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2.설정 추가

"JwtOptions": {
 "Issuer": "https://localhost:5001",
 "Audience": "https://localhost:5001",
 "SecurityKey": "1G3l0yYGbOINId3A*ioEi4iyxR7$SPzm"
}
3.Jwt Bearer 확장(옵션)

public static AuthenticationBuilder AddJwtBearer(this IServiceCollection services, Action<JwtOptions> configureOptions)
{
 if (configureOptions == null) throw new ArgumentNullException(nameof(configureOptions));

 var jwtOptions = new JwtOptions()
 {
  Issuer = "Jwt Authentication",
  Audience = "Wilson Pan Web Api",
 };
 // set customs optoins
 configureOptions(jwtOptions);

 // update Options 
 services.PostConfigure<JwtOptions>(options =>
 {
  options.Issuer = jwtOptions.Issuer;
  options.Audience = jwtOptions.Audience;
  options.SecurityKey = jwtOptions.SecurityKey;
 });

 return services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
     .AddJwtBearer(options =>
     {
      options.TokenValidationParameters = new TokenValidationParameters()
      {
       ValidIssuer = jwtOptions.Issuer,
       ValidAudience = jwtOptions.Audience,
       ValidateIssuer = true,
       ValidateLifetime = true,
       ValidateIssuerSigningKey = true,
       IssuerSigningKey = jwtOptions.SymmetricSecurityKey
      };
     });

}
4、ConfigureServices

services.AddJwtBearer(options =>
{
 options.Issuer = Configuration.GetValue<string>("JwtOptions:Issuer");
 options.Audience = Configuration.GetValue<string>("JwtOptions:Audience");
 options.SecurityKey = Configuration.GetValue<string>("JwtOptions:SecurityKey");
});
5、Configure

app.UseAuthentication();
app.UseAuthorization();
6、add AuthorizeController

//define claim 
var claims = new Claim[]
{
  new Claim(ClaimTypes.Name, username),
  new Claim(ClaimTypes.Email, $"{username}@github.com"),
  new Claim(ClaimTypes.Role, username == "WilsonPan" ? "Admin" : "Reader"),
  new Claim(ClaimTypes.Hash, JwtHashHelper.GetHashString($"{username}:{password}:{System.DateTime.Now.Ticks}")),
};

//define JwtSecurityToken
var token = new JwtSecurityToken(
  issuer: _jwtOptions.Issuer,
  audience: _jwtOptions.Audience,
  claims: claims,
  expires: System.DateTime.Now.AddMinutes(5),
  signingCredentials: _jwtOptions.SigningCredentials
);

// generate token
var result = new JwtSecurityTokenHandler().WriteToken(token);
7.contrller/Action 인증 권한 추가

[ApiController]
[Authorize]
[Route("[controller]")]
public class ApiController : ControllerBase
{
  ...
}

[HttpPost]
[Authorize(Roles = "Admin")]
public IActionResult Post()
{
  return Ok();
}
Rest Client

dotnet run
1.인증 인터페이스

@host = https://localhost:5001

# @name token
POST {{host}}/Authorize HTTP/1.1
Content-Type: application/x-www-form-urlencoded

#username=Wilson&password=123456
# admin 
username=WilsonPan&password=123456
2.권한 부여 인터페이스 필요

### required authorize
GET {{host}}/api HTTP/1.1
Authorization: Bearer {{token.response.body.*}}
3.관리자 역할 인터페이스 필요

### required authorize
POST {{host}}/api HTTP/1.1
Authorization: Bearer {{token.response.body.*}}
예제 코드
총결산
여기 서 ASP.NET Core 학습 의 JWT 인증 사용 권한 수여 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 ASP.NET Core 는 JWT 인증 권한 수여 내용 으로 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기