2

OpenIdDict를 인증에 사용하는 asp.net 핵심 웹 앱이 있습니다. 인증되지 않은 Ajax 호출이 응답 본문에 200 및 로그인 양식을 반환하는 것으로 나타났습니다. OpenIdDict가 요청을 처리 한 이후로 예상 한 동작이므로 ASP.NET 코어가이를 처리하고 200을 반환합니다. Startup.cs에서 'UseIdentity()'가 호출되기 때문에 ASP.NET 코어가 처리합니다. OpenIdDict에서 본 모든 예제는 'UseIdentity'를 호출합니다. 나는 2 개의 질문이있다.openIdDict를 사용하면 Startup.cs에서 'UseIdentity()'가 필요합니까?

  1. ASP.NET 코어가 내 요청을 처리하는 것을 원하지 않는다면 'UseIdentity()'를 제거하면됩니까? 나는 그것을 시도하고 이제는 200 대신 401이 생겼다.이 일에 어떤 해가 되는가 아니면 OpenIdDict에 'UseIdentity()'가 필요합니까?
  2. UI보기에 대한 리디렉션 로그인 기능을 잃고 싶지 않으면 OnRedirectToLogin을 재정의하기 위해이 방법을 사용하는 것이 가장 쉽고/가장 안전합니다. 코드 예제 아래 :

options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents { OnRedirectToLogin = ctx => { if (ctx.Request.Path.StartsWithSegments("/api") && ctx.Response.StatusCode == (int) HttpStatusCode.OK) { ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized; } else { ctx.Response.Redirect(ctx.RedirectUri); } return Task.FromResult(0); } };

코드 샘플 소스 : 여기에이 문제의 https://devblog.dymel.pl/2016/07/07/return-401-unauthorized-from-asp-net-core-api/

또한 토론 : https://github.com/aspnet/Security/issues/804

답변

3

은 'UseIdentity을()'이 필요 OpenIdDict합니까?

아니, app.UseIdentity()에 의해 후드 아래에 등록 된 쿠키 미들웨어 직접 그래서 OpenIddict가 제대로 작동하려면이 방법이 필요하지 않습니다 전화, OpenIddict에 의해 사용되지 않습니다.

쿠키 인증 (거의 모든 내용이 AccountController/ManageController)에 의존하는 ASP.NET 핵심 ID 기능을 사용하는 경우 app.UseIdentity()을 사용해야합니다.

내가 OpenIdDict 호출 'UseIdentity', 당신은 the official password flow sample에서 살펴 또는 this blog post을 읽을 수 app.UseIdentity()를 사용하지 않는 샘플의 경우

에 대한 본 적이 모든 예제

, 즉 방법을 보여줍니다 ASP.NET Core Identity없이 OpenIddict를 사용합니다.

내가 UI보기 위해 로그인 할 리디렉션에 대한 능력을 상실하고 싶지 않은 경우는 OnRedirectToLogin 오버라이드 (override)이 달성의 가장 좋은/간단한/가장 안전한 방법이다?

이 확실히 작동하지만, 나는 개인적으로 app.UseIdentity()에 의해 등록 된 쿠키 미들웨어를 제외 분기 파이프 라인을 사용하여 구성되어 안전한 옵션을 선택했다했습니다. 이것은 당신의 API에 의해 반환 된 401 개 응답을 하이재킹에서 신원을 방지 할 수 있지만 HttpContext.User가 쿠키에서 추출 된 신원 채울 수 없습니다로도 XSRF 공격을 방지 할뿐만 아니라 :

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), branch => 
{ 
    branch.UseIdentity(); 
}); 

완전한 샘플 https://github.com/openiddict/openiddict-samples/blob/master/samples/CodeFlow/AuthorizationServer/Startup.cs#L141-L158를 참조하십시오.

+0

잘 작동합니다. 감사! – Bloodhound

+0

Core 2.0 및 OpenIdDict 2.x에서 같은 작업을 수행하는 샘플 프로젝트 나 가이드가 있습니까? – Bloodhound

+1

모든 OpenIddict 샘플이 2.x 용으로 업데이트되었습니다 : https : // github.co.kr/openiddict/openiddict-samples. 안타깝게도 경로 기반 인증 미들웨어 선택은 2.x에서 더 이상 지원되지 않으며'[Authorize (AuthenticationSchemes = "Bearer")] 접근 방식을 사용하는 것이 좋습니다. 자세한 내용은 https://github.com/aspnet/Announcements/issues/262를 참조하십시오. – Pinpoint