반응형
cookie(session을)를 기본으로하는 로그인 인증방법을 소개합니다.
①Startup.cs수정
페이지엑세스에 대한 처리는 하지않으므로 미인증시에 로그인화면으로 리다이렉트처리는 하지 않습니다.
그러므로 미인증시에는 로그인화면으로 이동하지않고 에러코드를 반환하는 처리를 합니다.
(로그인 화면이동은 클라이언트(프론트엔드)에서 처리합니다.)
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.AspNetCore.Authorization;
public void ConfigureServices(IServiceCollection services)
{
//추가부분
services.AddAuthentication(options =>
{
// cookie기본의인증처리
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
{
options.SlidingExpiration = true;
options.Events.OnRedirectToLogin = cxt =>
{
// 로그인미확인시 에러코드 리턴
cxt.Response.StatusCode = StatusCodes.Status401Unauthorized;
return Task.CompletedTask;
};
options.Events.OnRedirectToAccessDenied = cxt =>
{
// 접속제한시 에러코드 리턴
cxt.Response.StatusCode = StatusCodes.Status403Forbidden;
return Task.CompletedTask;
};
options.Events.OnRedirectToLogout = cxt => Task.CompletedTask;
});
services.AddControllersWithViews(options =>
{
// 모든접속에대한 인증보호를 적용
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
{
app.UseRouting();
//추가부분
app.UseAuthentication();
app.UseAuthorization();
}
②로그인처리
로그인에 성공시에 쿠키값이 리턴으로 돌아갑니다.
/// <summary>로그인</summary>
/// <param name="loginId">로그인아이디</param>
/// <param name="password">패스워드</param>
/// <returns>StatusCode⇒로그인성공200(OK),로그인실패400(Error)</returns>
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Login(string loginId, string password)
{
//로그인아이디 확인
var LoginIdData = await 로그인아이디확인서비스
//로그인아이디가 존재하지 않을시에 에러
if (LoginIdData == null)
{
return BadRequest("로그인아이디가 존재하지 않습니다.");
}
//패스워드 확인
var passwordData = await 패스워드확인서비스
//패스워드가 일치하지 않을시에 에러
if (passwordData == null)
{
return BadRequest("패스워드가 일치하지않습니다.");
}
//로그인처리생성
var claims = new List<Claim>
{
//로그인아이디를 기준으로 로그인처리생성
new Claim(ClaimTypes.NameIdentifier, loginId),
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var claimsPrincipal = new ClaimsPrincipal(identity);
//로그인 연결지속시간설정
var authenticationProperties = new AuthenticationProperties
{
IsPersistent = true,
//1일로 설정
ExpiresUtc = DateTime.UtcNow.AddDays(1)
};
//로그인실행
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsPrincipal, authenticationProperties);
return Ok();
}
③로그아웃처리
로그아웃이 정상적으로 처리될시에는 로그인시 생성된 쿠키값이 삭제됩니다.
/// <summary>로그아웃</summary>
/// <returns>StatusCode⇒200OK</returns>
public async Task<IActionResult> Logout()
{
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
반응형
'API' 카테고리의 다른 글
Java로 REST API 구현하기 (2) | 2024.09.21 |
---|---|
API의 성능향상 방법 (0) | 2023.09.05 |
Google API 연동하는 방법 (0) | 2021.07.10 |
C# Swagger Debug Failed to load API definition. Fetch error undefined /swagger/v1/swagger.json에러발생 해결방법 (0) | 2021.03.19 |
댓글