API

.net core Web Api 로그인및 로그아웃 구현

지오준 2021. 7. 1.
반응형

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);
}
반응형

댓글