Не авторизован при передаче учетных данных на сервер отчетов из программы просмотра отчетов. - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующий контроллер (ReportsController.cs)

using Microsoft.Reporting.WebForms;
using System;
using System.Configuration;
using System.Web.Mvc;
using System.Net;

namespace ActiveDirectoryAuthentication.Controllers
{
    public class ReportsController : Controller
    {
        // GET: Reports
        public ActionResult Index()
        {
            string ssrsUrl = ConfigurationManager.AppSettings["SSRSReportsUrl"].ToString();
            ReportViewer viewer = new ReportViewer();
            IReportServerCredentials irsc = new CustomReportCredentials("uname", "pwd", "domain");
            viewer.ServerReport.ReportServerCredentials = irsc;
            viewer.ProcessingMode = ProcessingMode.Remote;
            viewer.SizeToReportContent = true;
            viewer.AsyncRendering = true;
            viewer.ServerReport.ReportServerUrl = new Uri(ssrsUrl);
            viewer.ServerReport.ReportPath = "/Temperature_Graphs_Reports/Temperature_Graphs";
            viewer.ServerReport.Refresh();

            ViewBag.ReportViewer = viewer;

            return View();
        }
    }

    public class CustomReportCredentials : IReportServerCredentials
    {
        private string _UserName;
        private string _PassWord;
        private string _DomainName;

        public CustomReportCredentials(string UserName, string PassWord, string DomainName)
        {
            _UserName = UserName;
            _PassWord = PassWord;
            _DomainName = DomainName;
        }

        public System.Security.Principal.WindowsIdentity ImpersonationUser
        {
            get { return null; }
        }

        public ICredentials NetworkCredentials
        {
            get { return new NetworkCredential(_UserName, _PassWord, _DomainName); }
        }

        public bool GetFormsCredentials(out Cookie authCookie, out string user,
         out string password, out string authority)
        {
            authCookie = null;
            user = password = authority = null;
            return false;
        }
    }
}

и следующий вид (Index.cs html):

@using ReportViewerForMvc;

@if (ViewBag.ReportViewer != null)
{
    @Html.ReportViewer(ViewBag.ReportViewer as Microsoft.Reporting.WebForms.ReportViewer)
}

Я могу просмотреть отчет без Передача учетных данных (передача их вручную).

При передаче учетных данных у меня появляется следующее сообщение об ошибке:

Ошибка сервера в приложении '/'.

Запрос не выполнен с HTTP-статус 401: не авторизован. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: система. Net .WebException: запрос не выполнен с состоянием HTTP 401: не авторизован.

Ошибка источника:

Во время выполнения возникло необработанное исключение текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью приведенной ниже трассировки стека исключений.

Трассировка стека:

[WebException: запрос не выполнен с состоянием HTTP 401: не авторизовано.] Microsoft. Reporting.WebForms.Internal. Soap .ReportingServices2005.Execution.RSExecutionConnection.GetSecureMethods () +192 Microsoft.Reporting.WebForms.Internal. Soap .ReportingServices2005.Execution.RSExecutionConnection.IsSname .Reporting.WebForms.Internal. Soap .ReportingServices2005.Execution.RSExecutionConnection.SetConnectionSSLForMethod (имя метода String) + 12
Microsoft.Reporting.WebForms.Internal. Soap .ReportingServices2005.ExecutionInteoc. ProxyMethod 1 initialMethod, ProxyMethod 1 retryMethod) +449 Microsoft.Reporting.WebForms.Internal. Soap .ReportingServices2005.Execution.RSExecutionConnection.LoadReport (Строковый отчет, String HistoryID) + 180
Microsoft.Reporting .WebForms. *
ReportViewerFor Mvc .ReportViewerWebForm.Page_Load (Отправитель объекта, EventArgs e) + 5
System.Web.Util.CalliEventHandlerDelegateProxy.Callback (Отправитель объекта, EventArgs e) +52 System.Web.UI.Control.OnLad ( EventArgs e) + 97
System.Web.UI.Control.LoadRecursive () + 61
System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 693

Это значение rsreportserver.config

<AuthenticationTypes>            
  <RSWindowsNTLM/>
</AuthenticationTypes>

В Report Server Configuration Manager в Web Portal URL, когда я нажимаю URL, у меня появляется это сообщение об ошибке

The service is not available. The report server isn’t configured properly. Contact your system administrator to resolve the issue. System administrators: The report server Web Portal URLs and Web Service URLs don’t match. Use Reporting Services Configuration Manager to configure the URLs and ensure they match.

1 Ответ

1 голос
/ 17 января 2020

Насколько я могу судить, ваш код в порядке. Я просто набрал быстрый шаблон MVC проекта , чтобы проверить его на своем экземпляре SSRS, и успешно запустил его без изменений в вашем коде.

Так что, похоже, проблема скорее в среда, в которой вы работаете:

  1. Проверьте, настроен ли SSRS для принятия указанных вами запросов аутентификации c (он должен поставляться с NTLM и Negotiate по умолчанию, но вы не указали, так ли это для вас).

  2. Сам элемент управления ReportViewer опирается на сеанс ASP. NET для сохранения состояния, поэтому проверьте если вам нужно обойти это .

Поскольку я не очень разбираюсь в вашей настройке c, я не могу быть более точной c, но, надеюсь, это дает вам несколько вариантов для изучения.

...