Несанкционированная ошибка 401 на веб-сайтах azurewebsites.net webapp после интеграции Microsoft Identity MSAL. Localhost работает

#c# #azure #asp.net-core-3.1 #msal #microsoft-identity-platform

#c# #azure #asp.net-core-3.1 #msal #microsoft-identity-platform

Вопрос:

Мое веб-приложение c # на локальном хостинге работает.

Однако после публикации в Azure веб-сайт не отображает никакого содержимого и возвращается с несанкционированной ошибкой 401.

Просматривая журнал событий приложения, журнал событий приложения на портале Azure, я вижу следующую ошибку.

 Category: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware
EventId: 1
RequestId: 80001a7a-0002-f800-b63f-84710c7967bb
RequestPath: /
SpanId: |51dbc300-47e836e38a7ad2a4.
TraceId: 51dbc300-47e836e38a7ad2a4
ParentId: 

An unhandled exception has occurred while executing the request.

Exception: 
System.InvalidOperationException: Unable to resolve service for type 'System.Net.Http.IHttpClientFactory' while attempting to activate 'Microsoft.Identity.Web.AppServicesAuthenticationTokenAcquisition'.
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, Type serviceType, Type implementationType, CallSiteChain callSiteChain)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain, Int32 slot)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, CallSiteChain callSiteChain)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite(Type serviceType, CallSiteChain callSiteChain)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.<>c__DisplayClass7_0.<GetCallSite>b__0(Type type)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(Type serviceType, CallSiteChain callSiteChain)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.CreateServiceAccessor(Type serviceType)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DefaultPageModelActivatorProvider.<>c__DisplayClass1_0.<CreateActivator>b__0(PageContext context)
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.DefaultPageModelFactoryProvider.<>c__DisplayClass3_0.<CreateModelFactory>b__0(PageContext pageContext)
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.CreateInstance()
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.Next(Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
   at Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(Stateamp; next, Scopeamp; scope, Objectamp; state, Booleanamp; isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
 

Следующее относится к службам AddAuthetication в startup.cs

     services
       // Use OpenId authentication
       .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
       // <AddSignInSnippet>
       // Specify this is a web app and needs auth code flow
       .AddMicrosoftIdentityWebApp(options =>
       {
           Configuration.Bind("AzureAd", options);
           options.Prompt = "select_account";
           options.Events.OnTokenValidated = async context =>
           { ....
 

Я не уверен, как устранить эту ошибку, учитывая два разных результата для azure hosted и localhost.

Ответ №1:

В вашем коде не отображаются IHttpClientFactory DI и constructor, но, скорее всего, это происходит по следующим причинам:

  1. IHttpClientFactory пытается вызвать AppServicesAuthenticationTokenAcquisition конструктор и каким-то образом он не получает activated , а затем происходит сбой внедрения зависимостей (DI) IHttpClientFactory .
  2. И поскольку аутентификация инициализирована неправильно, ваше приложение по-прежнему выполняет вызовы аутентифицированного API / сервиса, который выдает 401 ошибку.

Комментарии:

1. Знаете ли вы, имеет ли значение, было ли приложение развернуто как автономное и переносимое по отношению к IHttpClientFactory?

2. Я не понял вашего вопроса, можете ли вы уточнить?