Средство просмотра отчетов SSRS + исключение учетных данных ASP.NET 401 - PullRequest
7 голосов
/ 17 сентября 2009

У меня есть отчет, сохраненный на сервере отчетов SQL2005, и я хочу вернуть обработанный PDF этого отчета. Я понял это при работе с локальным файлом * .rdlc (, и я писал об этом ), но не тогда, когда * .rdl находится на сервере отчетов. Я получаю ошибку 401 Not Authorized в строке ...

reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);

Вот метод, используемый для визуализации отчета.

public byte[] Render(IReportDefinition reportDefinition)
{
    var reportViewer = new ReportViewer();
    byte[] renderedReport;
    try
    {
        var credentials = new WindowsImpersonationCredentials();
        reportViewer.ServerReport.ReportServerUrl = new Uri("http://myssrsbox", UrlKind.Absolute);
        reportViewer.ServerReport.ReportServerCredentials = credentials;
        reportViewer.ServerReport.ReportPath = reportDefinition.Path;
        // Exception is thrown on the following line...
        reportViewer.ServerReport.SetParameters(reportDefinition.ReportParameters);

        string mimeType;
        string encoding;
        string filenameExtension;
        string[] streams;
        Warning[] warnings;

        renderedReport = reportViewer.ServerReport.Render(reportDefinition.OutputType, reportDefinition.DeviceInfo, out mimeType, out encoding, out filenameExtension, out streams, out warnings);
    }
    catch (Exception ex)
    {
        // log the error...
        throw;
    }
    finally
    {
        reportViewer.Dispose();
    }
    return renderedReport;
}

Другая вещь, которую вам не хватает, - это класс WindowsImpersonationCredentials.

public class WindowsImpersonationCredentials : IReportServerCredentials
{
    public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
    {
        authCookie = null;
        userName = password = authority = null;
        return false;
    }

    public WindowsIdentity ImpersonationUser
    {
        get { return WindowsIdentity.GetCurrent(); }
    }

    public ICredentials NetworkCredentials
    {
        get { return null; }
    }

    public override string ToString()
    {
        return String.Format("WindowsIdentity: {0} ({1})", this.ImpersonationUser.Name, this.ImpersonationUser.User.Value);
    }
}

Другие вещи, которые вы, возможно, должны знать ...

  • Это работает во внутренней сети, и олицетворение включено.
  • Ведение журнала указывает на то, что пользователь олицетворения настроен правильно.
  • Этот работает при работе в Visual Studio (http://localhost:devport), а работает при работе на моем компьютере для разработки (http://localhost/myApplication). Он не работает при работе на наших тестовых или производственных серверах.
  • Я пробовал решения как с настройками system.net.defaultProxy, так и без них в файле web.config. Ни один не работал.

Что я делаю не так? Это настройка сервера? Это код? Это web.config?

Ответы [ 2 ]

6 голосов
/ 17 сентября 2009

Мы наконец выяснили проблему. Наши сетевые администраторы отключили двойное переключение, поэтому, когда олицетворение правильно подключалось как domain\jmeyer, приложение все еще пыталось подключиться к блоку SRS с domain\web01$. Почему это настроено так? Потому что двойной прыжок - это огромная дыра в безопасности. (Или мне сказали. Похоже ли это на то, что вы читали бы на The Daily WTF ?)

Наше решение состояло в том, чтобы создать общего пользователя domain\ssrs_report_services и связать с этим пользователем следующие сетевые учетные данные

public class CustomCredentials : IReportServerCredentials
{
    public bool GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority)
    {
        authCookie = null;
        userName = password = authority = null;
        return false;
    }

    public WindowsIdentity ImpersonationUser
    {
        get { return null; }
    }

    public ICredentials NetworkCredentials
    {
        get { return new NetworkCredential("ssrs_report_services", "password", "domain") ; }
    }    
}

Выше приведен классический пример решения, которое вы можете найти во всех интернетах.

2 голосов
/ 21 сентября 2009

Допускается «двойное переключение» - с проверкой подлинности Kerberos ... (при условии, что она работает правильно!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...