안녕하세요 .net과 blazor를 이용해서 공부를 하고 있는 학생입니다…
간단한 웹 프로젝트를 만들고 있는 와중에 로그인 관련해서 막히는 부분이 있어서 이렇게 질문 드립니다.
문제의 핵심은 postman이나 중단점을 찍으면서 보면 서버쪽에서는 쿠키가 생성이 잘 되는 것을 확인 했는데 생성된 쿠키가 정작 브라우저 개발자 도구에는 없는 것이 문제입니다…
먼저 컴포넌트 에서 로그인 api를 요청하면 해당 메서드를 통해 api컨트롤러에 요청을 보냅니다. 밑에 token부분은 쿠키를 이용하다가 안되서 token도 써보고 이것저것 하느라 정리를 못해서 부득이하게 놔둔건데 무시하셔도 될 것 같습니다…
public async Task<string> Login(EmployeeLoginModel emp)
{
const string baseUrl = "api/auth/login";
var response = await _httpClient.PostAsJsonAsync(baseUrl, emp);
if (!response.IsSuccessStatusCode)
{
return "";
}
var token = await response.Content.ReadAsStringAsync();
return token;
}
그리고 api컨트롤러 부분 코드입니다.
[HttpPost("login")]
public async Task<ActionResult<string>> SignInAsync([FromBody] EmployeeLoginModel emp)
{
var cosmosEmployee = await _employeeService.Login(emp);
if (cosmosEmployee is null)
{
return Forbid();
}
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, emp.Id),
new Claim(ClaimTypes.Name, cosmosEmployee.Name),
new Claim(ClaimTypes.Gender, cosmosEmployee.Gender),
new Claim(ClaimTypes.Role, cosmosEmployee.DepartmentId)
};
var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(principal), new AuthenticationProperties
{
IsPersistent = false,
});
return Ok("success");
}
그리고 program.cs부분에 쿠키의 옵션 값을 설정한 부분입니다.
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
options.Cookie.Name = "auth";
options.LoginPath= "/";
options.Cookie.SameSite = SameSiteMode.Strict;
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.StatusCode = 403;
return Task.CompletedTask;
};
});
옵션 값에서 samesite옵션을 none으로도 줘보고 다른 HttpOnly라던지 여러가지 속성도 설정해봤는데도 여전히 브라우저에서 쿠키를 확인할수가 없습니다…
PostMan을 통해서 api요청을 해보고 생성된 쿠키값을 제가 브라우저 개발자도구에 가서 등록을 하고 새로고침을 하면 AuthorizeView를 통해 인증된 컴포넌트가 출력이 되는게 확인은 되는데 왜 브라우저에서 로그인 버튼을 누르면 쿠키가 등록이 안되는지 이유를 모르겠습니다…