ASP.NET Core Identity에서 인증 오류시 401 반환

3986 단어 .NETCoreASP.NET_Core
ASP.NET MVC에서는 친숙한 Identity 라이브러리군요. 사용자 관리는 이것에 맡기면 개발이 매우 편해집니다.
다만, 여러가지 모습도 있으므로 이번은 인증 에러시의 이야기를 합니다.

401을 반환하면 302가 반환됩니다.



죄송합니다. 일본어가 이상합니다.
아니고 있는 그대로 말하면 이렇게 됩니다.

예를 들어 단순히 DB로부터 전건 취득만의 API로, 인증되어 있지 않은 유저라면 401을 돌려주는 API를 써 보겠습니다.
[Route("api/projects")]
public class ProjectsController : Controller
{
    private readonly DatabaseContext db;

    public ProjectsController(DatabaseContext db)
    {
        this.db = db;
    }

    [Authorize]
    [HttpGet]
    public async Task<IEnumerable<Project>> GetProjects()
    {
        return await db.Projects.ToListAsync();
    }
}

이제 인증되지 않은 클라이언트에서 401이 될 것이라고 생각하십니까? 하지만 실제로는 302(Found)가 돌아옵니다.



호라아(사망)

Identity씨 왜 이런 일을 하는 거야?



이것은 Identity의 사양으로, 즉 인증되지 않은 사람은 로그인 페이지까지 날아 갑시다 ~라는 것을 해주고 있습니다. Header에 붙어 있는 URL은 디폴트의 것으로, 대략의 시스템은 이 URL 날면 로그인 화면 갈 수 있는 것.

MVC를 사용하는 사람은 괜찮을지도 모르지만 WebAPI로 사용하고 싶은 사람들에게는 성가신 천만입니다.

401로 만들기 위한 어리석은



Identity 인증에 쿠키를 사용하고 있는 경우에 이런 거동이 되는 것 같습니다.

Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseIdentity();
    app.UseCookieAuthentication(new CookieAuthenticationOptions()
    {
        AutomaticChallenge = false
    });
}
AutomaticChallenge 를 false로 설정하면 리디렉션이 사라집니다.

swagger로 액세스하면 401이 반환됩니다.
테스트 코드로 이동하면 InvalidOperationException 예외가 발생합니다.


보통 상태 코드 401의 응답으로 좋지만 ....

좋은 웹페이지 즐겨찾기