#asp.net #iis #reporting-services #reportviewer
Вопрос:
Прежде чем я перейду к этому вопросу, позвольте мне сначала объяснить архитектуру, с которой я работаю.
- DB-Сервер — SQL Server 2019, Windows 2019
- SSRS-Сервер — SSRS 2019, Windows 2019
- Веб-сервер — IIS v10, Windows 2019
Все серверы находятся в одном домене.
Приложение, предоставляющее отчет, написано в ASP.NET использование элемента управления rsweb:ReportViewer.
Требование: Мне нужна возможность доступа к отчетам из ASP.NET приложение, использующее учетную запись машинного уровня.
Текущая ошибка: Запрос не выполнен со статусом HTTP 401: Несанкционированный.
То, что я сделал до сих пор…
- Добавлена учетная запись компьютера в SSRS. Я дал ему разрешения на всех уровнях: настройки сайта, папки, отчеты. Как только я заставлю его работать, я отключу права, но сейчас мне нужно, чтобы он работал. Эта учетная запись машинного уровня является веб-сервером. Я предполагаю, что любой доступ с веб-сервера к SSRS-серверу будет предоставлен.
- Изменил идентификатор пула приложений на LocalSystem. Да, это может нарушить наименьшие привилегии, но опять же, на данный момент я рассматриваю это как POC. Я также пробовал NetworkService.
- Web.config. Возможно, мне нужно что-то сделать здесь, чтобы это сработало. Я пытался использовать олицетворение личности, но безуспешно, но, возможно, я не использовал его в сочетании с другой настройкой. Когда у меня установлен режим аутентификации Windows, идентификатор Windows, используемый ASP.NET является ОРГАНОМ NTIUSR. Удаление этой строки дает мне ПОЛНОМОЧИЯ NTСЕТЕВАЯ СЛУЖБА в качестве удостоверения Windows. Я бы подумал, что учетная запись СЕТЕВОЙ СЛУЖБЫ будет предоставлена; однако это все равно приводит к ошибке 401.
- Изменен файл «rsreportserver.config» (C:Program ФайлыСлужбы отчетов Microsoft SQL ServerSSRSСервер отчетовrsreportserver.config)
- ASP.NET Настройка средства просмотра отчетов:
ReportViewer1.ServerReport.ReportPath = rc.report_ssrs_path; ReportViewer1.ServerReport.ReportServerUrl = new System.Uri(rc.report_ssrs_url); SqlConnectionStringBuilder conString = new Database().conBuilder; List<ReportParameter> parameters = new List<ReportParameter>(); parameters.Add(new ReportParameter("ConString", conString.ConnectionString)); ReportViewer1.ServerReport.SetParameters(parameters); DataSourceCredentials dsc = new DataSourceCredentials(); dsc.Name = ReportViewer1.ServerReport.GetDataSources()[0].Name; dsc.UserId = conString.UserID; dsc.Password = conString.Password; ReportViewer1.ServerReport.SetDataSourceCredentials(new DataSourceCredentials[] { dsc }); ReportViewer1.ShowCredentialPrompts = false; ReportViewer1.ServerReport.Refresh();
Если бы кто-нибудь мог помочь, я был бы очень признателен. Я рыскал по Интернету в поисках решения этой проблемы, но безуспешно. Кажется, что это должно быть возможно, и многое из того, что я читал, звучит так, как будто это так. Я уверен, что просто упускаю что-то незначительное.
Комментарии:
1. Вы можете использовать отслеживание неудачных запросов для просмотра подробной информации об ошибках.