ejyoo's 개발 노트

닷넷코어의 인증과 인가 본문

BackEnd/.Net Core

닷넷코어의 인증과 인가

ejyoovV 2023. 7. 20. 15:17

지난시간 회고

 

* API 만들고 스웨거 API 뷰어로 보기

 

--

 

* 실제 DB 연동 - appsetting 설정

  * 도커 설치 - 이미지 다운 - 컨테이너 올리고 - 도커돌리기 - db 서버 실행

  * 도커 설정 docker 관련 yml

  * docker compose up -d : 백그라운드에서 설정된 도커 정보를 실행하겠다.

  * postman 으로 만든 api를 실행시켜 테스트 한다 / 또는 swagger

 

--

 

** front 와 연동할 login api를 만듬

// login api
app.MapGet("/login", (HttpContext context) => {
    return true;
});

* 닷넷 빌드 및 닷넷 런 하여 실행

* postman에서 주소 입력하고 실행

 

* *인증위한 쿠키 설정

* 코드작성 (빌드 서비스)

// ttl
// 권한 사용할 미들웨어 서비스 추가
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => {
    options.ExpireTimeSpan = TimeSpan.FromMinutes(3);
    options.SlidingExpiration = true;
    options.LoginPath = "/Signin";
    options.AccessDeniedPath = "/Forbidden";

});
builder.Services.AddAuthorization();
app.UseAuthentication(); // 인증
app.UseAuthorization(); // 권한
// login api
app.MapGet("/login", async (HttpContext context) => {
    // 인증처리 추가

    //1. 알아서 리스폰스 헤더에 알아서 쿠키를 만들어줌? context가 제공해주는 권한 설정을 사용함
    var claims = new List<Claim>{
        new Claim(ClaimTypes.Name, "ejyoo")
    };

    var claimsIndentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // 스키마 이름 동일하게 해야함.
    await context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal: new ClaimsPrincipal(claimsIndentity));

    return true;
});

* 쿠키확인

* 만약 자동완성 안될때 오미샤프 확인? (씨샵 익스텐션 = 오미샤프)

* 쿠키테스트

  - 쿠키확인용 api 생성 후  서비스 엪피아이 확인

// 쿠키 확인용 api
app.MapGet("/me", (HttpContext context, ClaimsPrincipal principal) => {
    return $"Hello, {principal.Identity.Name}";
});

* 확인

이름이 안나온다면 3분이 지나서임

다시 로그인 하고 실행해보면 보일것임

* 특정 서비스 실행 시 로그인이 되어야 접근 가능하게 설정

특정  서비스 인증이후  접근하도록  설정

app.MapGet("/todoitems", async (AppDbContext db) =>
    await db.Todos.ToListAsync()).RequireAuthorization();

* 3분후 실행해보면 302뜨고 signin 페이지 이동 되는지 확인 

- 확인할 때 스웨거 404 개발자 도구는 302

- 로그인 안될 시 로그인 패스로 넘기도록 설정되어서 싸인인으로 들어감

* admin 으로 설정

.RequireAuthorization(p => p.RequireRole("admin"));

 

----- 여기까지가 dotnet core의 인증과 인가 이야기임.

----- 쿠키 말고 제이떠블유 토큰을 쓰겠다 또는 다른 인증 도구를 쓰겠다 등 여러가지로 커스텀 가능

-- 이렇게 인증과 인가를 했다라고 하면됨

 

* 어드민 통과 처리

var claims = new List<Claim>{
        new Claim(ClaimTypes.Name, "ejyoo"),
        new Claim(ClaimTypes.Role, "admin"),
    };
// login api
app.MapPost("/login", async (HttpContext context, UserDto usetDto) => {
    // 인증처리 추가

    //1. 알아서 리스폰스 헤더에 알아서 쿠키를 만들어줌? context가 제공해주는 권한 설정을 사용함
    var claims = new List<Claim>{
        new Claim(ClaimTypes.Name, "ejyoo")
        new Claim(ClaimTypes.Name, "admin")
    };

    var claimsIndentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // 스키마 이름 동일하게 해야함.
    await context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal: new ClaimsPrincipal(claimsIndentity));

    return true;
});

 

* 다시 로그인하고 todo 조회 해서 뜨는지 확인

 

나중에는 실제 사용자 패스를 받아 처리해야됨

 

* 유저 디티오 생성

public class UserDto
{
  public string Id { get; set; }
  public string PassWord {get; set; }
}

* 유저 디티오 인자 받아서 처리

// login api
app.MapPost("/login", async (HttpContext context, UserDto dto) => {
    // 인증처리 추가

    //1. 알아서 리스폰스 헤더에 알아서 쿠키를 만들어줌? context가 제공해주는 권한 설정을 사용함
    var claims = new List<Claim>{
        new Claim(ClaimTypes.Name, "ejyoo"),
        new Claim(ClaimTypes.Role, "admin"),
    };

    // DB 조회 및 Password 확인
    // db 조회 후 claims 설정
    var claimsIndentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // 스키마 이름 동일하게 해야함.
    await context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal: new ClaimsPrincipal(claimsIndentity));

    return true;
});

 

* 로그아웃 api 작성

app.MapGet("/logout", async (HttpContext context) => {
    await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    return true;
});

* 쿠키 빠지는지 확인

 

 

 

 

 

?????