Как разместить BOT Framework V4 BOT на IIS - PullRequest
0 голосов
/ 10 января 2019

Я размещаю свой BOT Framework V4 BOT на IIS. Конфигурация сервера как ниже

  1. Windows Server 2012 R2
  2. IIS 8,5

Я также установил dotnet-hosting-2.2.1-win.exe, который необходим для размещения BOT V4. Я установил пул приложений как неуправляемый код. Я установил путь к папке, в которой находится файл Startup.cs. Также, пожалуйста, найдите вложение журналы, созданные BOT. Тем не менее, это не работает ошибка, как показано ниже

Ошибка HTTP 403.14 - запрещено Веб-сервер настроен так, чтобы не перечислять содержимое этого каталога.

Detailed Error Information:
Module     DirectoryListingModule
Notification       ExecuteRequestHandler
Handler    StaticFile
Error Code     0x00000000
Requested URL      https://myServer/ConfRoomBOT/
Physical Path      ProjectPath
Logon Method       Anonymous
Logon User     Anonymous
Request Tracing Directory      C:\inetpub\logs\FailedReqLogFiles

Ниже приведен код web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\ConfRoom.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" />
    </system.webServer>
  </location>
  <system.net>
     <defaultProxy useDefaultCredentials="false">
        <proxy usesystemdefault="False" proxyaddress="http://xx.xxx.xx.xxx:8080" bypassonlocal="True" />
      </defaultProxy>
  </system.net>
</configuration>

Ниже приведены журналы, созданные BOT

Среда размещения: корневой путь к производственному контенту: E: \ Project \ DotNetCoreApps \ ConfRoomPub \ WithPII \ publish Сейчас слушаю on: http://127.0.0.1:41826 Приложение запущено. Нажмите Ctrl + C, чтобы закрыть вниз. информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [1] Запрос начала HTTP / 1.1 GET http://example.com/ConfRoom/ info: Microsoft.AspNetCore.Hosting.Internal.WebHost [1] Запросить запуск HTTP / 1.1 GET http://example.com/ConfRoom/ info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware [2] Отправка файла. Путь запроса: '/default.htm'. Физический путь: 'E: \ Project \ DotNetCoreApps \ ConfRoomPub \ WithPII \ publish \ wwwroot \ default.htm' информация: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware [6] Файл /default.htm не был изменен. Информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен в 184.4402ms 304 текст / html информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен в 188.1919ms 200 текст / html информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [1] Запрос запуска HTTP / 1.1 POST http://example.com/ConfRoom/api/messages application / json; charset = utf-8 373 info: Microsoft.AspNetCore.Hosting.Internal.WebHost [1] Запрос запуска HTTP / 1.1 POST http://example.com/ConfRoom/api/messages application / json; charset = utf-8 359 ошибка: Microsoft.AspNetCore.Server.Kestrel [13] Идентификатор соединения "0HLJNNKCOIPS7", Идентификатор запроса "0HLJNNKCOIPS7: 00000002": необработанное исключение вызвало приложение. System.InvalidOperationException: IDX20803: невозможно получить конфигурацию от: «https://login.botframework.com/v1/.well-known/openidconfiguration'. ---> System.IO.IOException: IDX20804: невозможно получить документ из: «https://login.botframework.com/v1/.well-known/openidconfiguration'. ---> System. время или не удалось установить соединение, так как подключенный хост имеет не ответил ---> System.Net.Sockets.SocketException: попытка подключения не удалась, так как подключенная сторона не ответила должным образом после периода время или не удалось установить соединение, так как подключенный хост имеет не смог ответить на System.Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, CancellationToken cancellationToken) --- Конец внутреннего исключения трассировка стека --- в System.Net.Http.ConnectHelper.ConnectAsync (Строковый хост, порт Int32, Отмена взята Отмена взята) в System.Threading.Tasks.ValueTask 1.get_Result() at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask 1.get_Result () в System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync (ValueTask 1 creationTask) at System.Threading.Tasks.ValueTask 1.get_Result ()
в System.Net.Http.HttpConnectionPool.SendWithRetryAsync (HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
в System.Net.Http.RedirectHandler.SendAsync (HttpRequestMessage запрос, CancellationToken CancellationToken) в System.Net.Http.HttpClient.FinishSendAsyncBuffered (Task 1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.HttpDocumentRetriever.GetDocumentAsync(String address, CancellationToken cancel) at Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(String address, IDocumentRetriever retriever, CancellationToken cancel) at Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync (CancellationToken отмена) --- конец трассировки стека внутренних исключений --- в Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync(CancellationToken cancel) at Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync () в Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.ValidateTokenAsync (String jwtToken, String channelId) вMicrosoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync (String схема, параметр String, идентификатор String channelId) в Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync (String authorizationHeader, String channelId) в Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken (String authHeader, учетные данные ICredentialProvider, HttpClient httpClient, String channelId) в Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken (String authHeader, учетные данные ICredentialProvider, String serviceUrl, HttpClient httpClient, String channelId) в Microsoft.Bot.Connector.Authentication.JwtTokenValidation.ValidateAuthHeader (String authHeader, учетные данные ICredentialProvider, IChannelProvider channelProvider, String channelId, String serviceUrl, HttpClient httpClient) в Microsoft.Bot.Connector.Authentication.JwtTokenValidation.AuthenticateRequest (IActivity активность, String authHeader, учетные данные ICredentialProvider, Поставщик IChannelProvider, httpClient HttpClient) в Microsoft.Bot.Builder.BotFrameworkAdapter.ProcessActivityAsync (String authHeader, Activity Activity, обратный вызов BotCallbackHandler, Отмена взята Отмена взята) в Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandler.ProcessMessageRequestAsync (HttpRequest запрос, адаптер IAdapterIntegration, BotCallbackHandler botCallbackHandler, CancellationToken CancellationToken) в Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandlerBase.HandleAsync (HttpContext httpContext) в Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke (HttpContext контекст) в Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.Builder.Extensions.UsePathBaseMiddleware.Invoke (HttpContext контекст) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests [TContext] (IHttpApplication 1 application) fail: Microsoft.AspNetCore.Server.Kestrel[13] Connection id "0HLJNNKCOIPS6", Request id "0HLJNNKCOIPS6:00000002": An unhandled exception was thrown by the application. System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://login.botframework.com/v1/.well-known/openidconfiguration'.<br> at Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync (CancellationToken отменить) в Microsoft.IdentityModel.Protocols.ConfigurationManager 1.GetConfigurationAsync() at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.ValidateTokenAsync(String jwtToken, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(String scheme, String parameter, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenExtractor.GetIdentityAsync(String authorizationHeader, String channelId) at Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(String authHeader, ICredentialProvider credentials, HttpClient httpClient, String channelId) at Microsoft.Bot.Connector.Authentication.ChannelValidation.AuthenticateChannelToken(String authHeader, ICredentialProvider credentials, String serviceUrl, HttpClient httpClient, String channelId) at Microsoft.Bot.Connector.Authentication.JwtTokenValidation.ValidateAuthHeader(String authHeader, ICredentialProvider credentials, IChannelProvider channelProvider, String channelId, String serviceUrl, HttpClient httpClient) at Microsoft.Bot.Connector.Authentication.JwtTokenValidation.AuthenticateRequest(IActivity activity, String authHeader, ICredentialProvider credentials, IChannelProvider provider, HttpClient httpClient) at Microsoft.Bot.Builder.BotFrameworkAdapter.ProcessActivityAsync(String authHeader, Activity activity, BotCallbackHandler callback, CancellationToken cancellationToken) at Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandler.ProcessMessageRequestAsync(HttpRequest request, IAdapterIntegration adapter, BotCallbackHandler botCallbackHandler, CancellationToken cancellationToken) at Microsoft.Bot.Builder.Integration.AspNet.Core.Handlers.BotMessageHandlerBase.HandleAsync(HttpContext httpContext) at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Builder.Extensions.UsePathBaseMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication 1 приложение) информация: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен в 21679,9889ms 500 info: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен в 14958.2414ms 500 info: Microsoft.AspNetCore.Hosting.Internal.WebHost [1] Запрос стартового HTTP / 1.1 POST http://127.0.0.1:41826/CONFROOM/iisintegration 0 info: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен за 0,373 мс 202 Приложение закрывается ...

Пожалуйста, помогите. Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Согласно сведениям об исключении, которые вы добавили в свой вопрос, это корневая проблема:

Приложение сгенерировало необработанное исключение. System.InvalidOperationException: IDX20803: невозможно получить конфигурацию из: 'https://login.botframework.com/v1/.well-known/openidconfiguration'. ---> System.IO.IOException: IDX20804: невозможно получить документ из:' https://login.botframework.com/v1/.well-known/openidconfiguration'. ---> системы. Net.Http.HttpRequestException: Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, так как подключенный хост не смог ответить

Теперь, если вы просто перейдете к этому с помощью браузера, вы должны увидеть, что нет проблем с получением ответа, включающего этот документ метаданных JSON, описывающий конфигурацию OpenID:

{
  "issuer": "https://api.botframework.com",
  "authorization_endpoint": "https://invalid.botframework.com",
  "jwks_uri": "https://login.botframework.com/v1/.well-known/keys",
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "token_endpoint_auth_methods_supported": [
    "private_key_jwt"
  ]
}

Хорошая новость в том, что ваш бот работает нормально. Это фактически указывает на то, что бот запустился и зашел достаточно далеко, чтобы подтвердить подлинность запроса, так что это хороший знак. Для меня это исключение пахнет тем, что, где бы ни находился ваш бот, он не может совершать исходящие запросы в Интернет. Это возможно? Это необходимо для проверки подлинности токена JWT, поступающего из платформы ботов, и, в конечном счете, он понадобится для отправки ответов клиентам через среду ботов. Возможно, вам придется работать для внесения в белый список HTTP-запросов к домену botframework.com.

0 голосов
/ 20 июня 2019

Это была проблема аутентификации IIS. Нам пришлось использовать учетную запись пользователя, которая имеет все привилегии, то есть администратор, для настройки ниже вещей

  1. Идентификация пула приложений
  2. IIS-аутентификация и авторизация размещенного приложения (Connect as).

Я удалил весь код, который написал для аутентификации, например, OAuth и т. Д.

Спасибо всем за ваше время.

0 голосов
/ 10 января 2019

Я думаю, что Дрю Марш обнаружил проблему в своем ответе, возможно, это проблема web.config.

Если вы собираетесь размещать основное приложение .net в IIS, IIS по-прежнему потребуется файл web.config в каталоге приложения, который будет также иметь отображение обработчика и путь aspNetCore.

По сути, IIS должен знать, что приложение является основным приложением .net и какой код запускать.

Возможно, я ошибаюсь, но похоже, что все воспринимается как статический файл.

Я получаю эту ошибку, если удаляю web.config из работающего основного приложения .net, размещенного в IIS.

Выглядит почти идентично вашей ошибке, и я допустил аналогичную ошибку.

Как правило, мне повезло с публикацией проекта в виде пакета IIS Web Deploy. Это имеет тенденцию создавать все необходимые биты.

Работающий web.confg может выглядеть примерно так.

<configuration>
      <system.webServer>
        <handlers>
          <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
        </handlers>
        <aspNetCore processPath="dotnet" arguments=".\blagh.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
      </system.webServer>
</configuration>
...