Средство просмотра отчетов SSRS - 401 неавторизовано

Мы перемещаем отчеты SQL Server с компьютера SQL Server 2008 (SP3) на компьютер SQL 2012 (SP1). Отчеты нормально работают в диспетчере отчетов (например, https://SQLRep2012/Reports)

Однако приложение ASP.net возвращает «Запрос не удался, HTTP-статус 401: неавторизован».

Я знаю, что у пользователя есть права, потому что я тестирую его с учетной записью администратора со всеми правами сети / SQL-сервера.

Найдите код ниже ...

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Security.Principal;
using System.Net;

public partial class Reports_ReportViewer : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack == false)
        {
            TimeReport GetReport1;
            GetReport1 = (TimeReport)Session["Report"];
            string FileName = GetReport1.GetReportFileName();

            //ReportViewer1.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
            ReportViewer1.ServerReport.ReportServerUrl = new Uri("https://SQLRep2012/ReportServer");
            ReportViewer1.ServerReport.ReportPath = "/TestReports/" + FileName;

            if (GetReport1.ParameterCount() != 0)
            {
                Microsoft.Reporting.WebForms.ReportParameter[] parameters1 = new Microsoft.Reporting.WebForms.ReportParameter[GetReport1.ParameterCount()];

                for (int i = 0; i < GetReport1.ParameterCount(); i++)
                {
                    parameters1[i] = new Microsoft.Reporting.WebForms.ReportParameter(GetReport1.ParameterName(i), GetReport1.ParameterValue(i));
                }

                //Create the creditial object and assign the username and password.
                ReportViewerCredentials rvc = new ReportViewerCredentials(ConfigurationManager.AppSettings["ReportUserID"],
                    ConfigurationManager.AppSettings["ReportUserPwd"],
                    ConfigurationManager.AppSettings["ReportUserDomain"]);

                //Make sure the credential object has the same report server url.
                rvc.ReportServerUrl = ReportViewer1.ServerReport.ReportServerUrl;

                //Save the credentials to the ReportViewer object.
                ReportViewer1.ServerReport.ReportServerCredentials = rvc;

                ReportViewer1.ServerReport.SetParameters(parameters1);
            }
        }       
    }
}
public class ReportViewerCredentials : Microsoft.Reporting.WebForms.IReportServerCredentials
{
    private string _username;
    private string _password;
    private string _domain;

    public Uri ReportServerUrl;

    public ReportViewerCredentials(string username, string password, string domain)
    {
        _username = username;
        _password = password;
        _domain = domain;
    }

    #region IReportServerCredentials Members

    public System.Security.Principal.WindowsIdentity ImpersonationUser
    {
        get
        {
            return null;
        }
    }
    public System.Net.ICredentials NetworkCredentials
    {
        get
        {
            System.Net.NetworkCredential nc = new NetworkCredential(_username, _password, _domain);
            CredentialCache cc = new CredentialCache();
            cc.Add(ReportServerUrl, "Negotiate", nc);
            return cc;
        }
    }
    public bool GetFormsCredentials
        (out Cookie authCookie,
        out string username,
        out string password,
        out string authority)
    {
        authCookie = null;
        authority = null;
        password = null;
        username = null;
        return false;
    }

    #endregion
}

person Jason Geiger    schedule 13.02.2015    source источник
comment
кто пользователь? тот, который использует браузер или пользователь пула приложений?   -  person gsharp    schedule 13.02.2015
comment
Пользователь является пользователем домена, имеющим права запускать рассматриваемые отчеты.   -  person Jason Geiger    schedule 13.02.2015
comment
я не об этом спрашивал. Обычно (если не настроено иначе) пользователь пула приложений - это пользователь, имеющий доступ к ресурсам и которому требуются соответствующие права.   -  person gsharp    schedule 13.02.2015
comment
@gsharp Если вы установите учетные данные в средстве просмотра отчетов, оно не будет использовать пользователя пула приложений.   -  person Jason Geiger    schedule 13.02.2015
comment
Согласен с @gsharp, я не наблюдал такого поведения, когда пробовал это в 2016 году. Даже после того, как вручную установил учетные данные в средстве просмотра отчетов. Мне удалось увидеть пользователя, проверив System.Security.Principal.WindowsIdentity.GetCurrent().Name, а затем изменить его на желаемый в диспетчере IIS. Для всех, кому интересно, у меня есть решение здесь.   -  person usr4896260    schedule 06.10.2017


Ответы (2)


Я уже придумал ответ до того, как опубликовал вышеупомянутый вопрос. Проблемы возникли из-за сетевых учетных данных. Раньше было такое ....

public System.Net.ICredentials NetworkCredentials
{
    get
    {
        System.Net.NetworkCredential nc = new NetworkCredential(_username, _password, _domain);
        CredentialCache cc = new CredentialCache();
        cc.Add(ReportServerUrl, "Negotiate", nc);
        return cc;
    }
}

Однако это не работает для меня в SQL 2012. Мне пришлось изменить его только на это.

public System.Net.ICredentials NetworkCredentials
{
    get
    {            
        return new NetworkCredential(_username, _password, _domain);
    }
}
person Jason Geiger    schedule 13.02.2015
comment
Я разместил это в надежде, что это кому-то поможет. Я бы вчера заплатил 20 долларов, чтобы разобраться в этом. #stackoverflowROCKS - person Jason Geiger; 13.02.2015

Создание NetworkCredential без параметра домена у меня работает.

public System.Net.ICredentials NetworkCredentials
{
    get
    {            
        return new NetworkCredential(_username, _password);
    }
}
person Manuel Pomares    schedule 17.10.2019