재우니의 블로그



https://github.com/mukeshkumartech/CookieAuthenticationInAsp.NetCore



인증을 추가하기 위해  AddAuthentication() 함수를 사용해야 합니다.


services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();


그리고 configuration 메소드에 사용하기 위해서 UseAuthentication() 함수를 실행합니다.


app.UseAuthentication();




전체적인 코드는 아래와 같습니다.


using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace CookieDemo
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}



사용자 정보의 유효성을 확인한 후 모든 정보가 올바른 경우 해당 사용자에 대한 ID를 만들고 쿠키 정보를 만듭니다. 이 주요 데이터를 기반으로 "SignInAsync"라는 일반 함수를 사용하여 로그인하려고 시도하고 모든 것이 올바른 방향으로 진행되면 홈 페이지로 리디렉션합니다.

아이디와 패스워드에 따라 접근 가능한 권한을 할당합니다. 인증 쿠키는 SignInAsync() 함수를 통해 생성 됩니다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;

namespace CookieDemo.Controllers
{
public class AccountController : Controller
{
public IActionResult Login()
{
return View();
}

[HttpPost]
public IActionResult Login(string userName, string password)
{
if(!string.IsNullOrEmpty(userName) && string.IsNullOrEmpty(password))
{
return RedirectToAction("Login");
}

//Check the user name and password
//Here can be implemented checking logic from the database
ClaimsIdentity identity = null;
bool isAuthenticated = false;

if (userName=="Admin" && password == "password"){
//Create the identity for the user
identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.Name, userName),
new Claim(ClaimTypes.Role, "Admin")
}, CookieAuthenticationDefaults.AuthenticationScheme);

isAuthenticated = true;
}

if (userName == "Mukesh" && password == "password")
{
//Create the identity for the user
identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.Name, userName),
new Claim(ClaimTypes.Role, "User")
}, CookieAuthenticationDefaults.AuthenticationScheme);

isAuthenticated = true;
}

if (isAuthenticated)
{
var principal = new ClaimsPrincipal(identity);

var login = HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);

return RedirectToAction("Index", "Home");
}
return View();
}

public IActionResult Logout()
{
var login = HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return RedirectToAction("Login");
}
}
}




인증과 함께 권한이 할당되었으니 이에 따라 접근 가능을 제어 해 보죠. 어트리뷰트로 Roles 를 다중 값으로 콤마로 구분하여 접근가능 한 로그인 대상자에게만 해당 컨트롤러를 호출할 수 있도록 되어 있습니다. 할당하지 않으면 권한과 상관없이 비인증자도 해당 컨트롤러를 호출하여 뷰의 결과물을 사용자에게 보여주게 됩니다.



using CookieDemo.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

namespace CookieDemo.Controllers
{

public class HomeController : Controller
{
[Authorize(Roles ="Admin, User")]
public IActionResult Index()
{
return View();
}

[Authorize(Roles ="Admin")]
public IActionResult Setting()
{
return View();

}

public IActionResult About()
{
ViewData["Message"] = "Your application description page.";

return View();
}

public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";

return View();
}

public IActionResult Privacy()
{
return View();
}

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}