3

시나리오 :System.InvalidOperationException 자동

  1. 가 새 Asp.Net 코어 만들기 (버전 1.0.0) 프로젝트
  2. 웹 API 템플릿을 선택
  3. 기본 ValuesController
  4. 응용 프로그램을 실행

내가 r에 경우에 [Authorize] 속성을 추가 유엔은 IIS와 응용 프로그램과 내가 황조롱이와 응용 프로그램을 실행하지만 경우 내가 예상 401 Unauthorized error

를 얻을 http://localhost:60513/api/values에 GET 요청을 (예 : dotnet run를) 나는 다음과 같은 예외에서와 500 Internal Server Error를 얻을 수 http://localhost:5000/api/values에 GET 요청을 황조롱이 :

Now listening on: http://localhost:5000 
Application started. Press Ctrl+C to shut down. 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] 
     Request starting HTTP/1.1 GET http://localhost:5000/api/values 
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] 
     Authorization failed for user: . 
warn: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1] 
     Executing ChallengeResult with authentication schemes(). 
fail: Microsoft.AspNetCore.Server.Kestrel[13] 
     Connection id "0HKUMMBBBQ6AU": An unhandled exception was thrown by the application. 
System.InvalidOperationException: No authentication handler is configured to handle the scheme: Automatic 
    at Microsoft.AspNetCore.Http.Authentication.Internal.DefaultAuthenticationManager.<ChallengeAsync>d__12.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.ChallengeResult.<ExecuteResultAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeResultAsync>d__32.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__18.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.<Invoke>d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.<RequestProcessingAsync>d__2.MoveNext() 
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 
     Request finished in 282.8427ms 200 

내 응용 프로그램이 서로 다른 결과를 호스팅하는 서버에 따라 왜 내 질문은 입니까? Kestrel과 IIS가 인증을 다르게 처리하는 이유는 무엇입니까?

StackOverflow에는 this이나 this other과 같은 질문이 있지만 모두 필터 또는 미들웨어가 관련된 복잡한 시나리오에 사용됩니다.

MVC 이외의 AspNet 파이프 라인에 미들웨어가없고 AspNet Web API 템플릿에 의해 [Authorize] 특성을 제외한 모든 코드가 자동으로 생성됩니다.

+0

올바른 태그 사용에 대한 http://stackoverflow.com/help/tagging – Tseng

+0

어떤 태그가 없어야하는지에 대한 제안이 있으십니까? – iberodev

+0

_ 제목에 태그를 넣으면 안됩니다. _ – Tseng

답변

2

AspNet Security의 this thread에 따르면 모든 작업 또는 컨트롤러의 Authorize 특성에는 챌린지를 생성하기 위해 파이프 라인에 하나 이상의 인증 미들웨어가 필요합니다. IIS를 사용할 때 IIS 미들웨어가 사용되지만 Kestrel을 사용할 때 인증 미들웨어가 없으므로 자체 미들웨어를 추가해야합니다.