Исключение Owin InvalidOperation при запуске в промежуточном программном обеспечении аутентификации или карты - PullRequest
0 голосов
/ 29 августа 2018

У нас есть обычное веб-приложение asp.net и добавлена ​​аутентификация OpenID Connect на основе Owin (AzureAD). На моей локальной машине на IIS Express запуск Owin вообще не был запущен, даже если была Microsoft.Owin.Host.SystemWeb dll, мы пробовали также с настройками, такими как owin:AutomaticAppStartup и owin:appStartup, ничего не изменилось. Единственное решение, которое заставило Овина работать локально, состояло в том, чтобы Инициализировать его в Global.asax.cs ctor WebApplication, вызвав Microsoft.Owin.Host.SystemWeb.PreApplicationStart.Initialize();

При развертывании в Azure (облачная служба, у нас есть доступ к виртуальной машине) на IIS приложение запускает следующую трассировку стека во время запуска веб-роли:

[InvalidOperationException]: Operation is not valid due to the current state of the object.
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.PushLastObjects(IDictionary`2 environment, TaskCompletionSource`1 completionSource)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.Epilog(IDictionary`2 env)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.DefaultAppInvoked(IDictionary`2 env)
   at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.<DoFinalWork>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)
   at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
-->

Кто-нибудь знает, где и что может быть причиной проблемы? У меня нет глубокого понимания внутренних компонентов Owin и того, как инициализируется конвейер, поэтому я не уверен, основываясь на этой трассировке, происходит ли это при запуске приложения или во время фактического запроса, но так как он не содержит никакого кода нашей реализации Я полагаю, это не удается при запуске. Может быть, на обычном IIS Owin запускался нормально, в отличие от IIS Express, и этот дополнительный вызов в Global.asax вызывает это странное исключение?

1 Ответ

0 голосов
/ 30 августа 2018

Хотя я не уверен, почему Овин ломается так загадочно, главной причиной, по которой он оказался, действительно был явный вызов PreApplicationStart.Initialize(), так как при запуске IIS запуск выполняется нормально только при наличии SystemWeb , и, по-видимому, инициализация модуля обработки запроса Owin вообще не повторяется. Мы изменили код, чтобы выполнять явную инициализацию только в локальных средах, и теперь он работает, как и ожидалось, как в IIS в облаке, так и в IIS Express локально.

...