Программный вход на сервер Crystal Reports

У меня есть приложение веб-форм, которое использует проверку подлинности с помощью форм. У меня есть сервер Crystal Reports Server 2008 V1 с установленным и работающим InfoView .NET. У меня есть несколько настроек корпоративных учетных записей. РЕДАКТИРОВАТЬ: я должен упомянуть, что мое приложение Web Forms находится на сервере, отличном от сервера Crystal Reports.

Мне нужно знать, как программно войти в InfoView .NET на моей пользовательской странице ASP .NET (C#), а затем перевести пользователя в InfoView без необходимости вводить информацию для входа.

Что-то вроде этого было бы неплохо (С#):

string username = "blah";
string password = "asdf";

// create logon token for crystal reports server
// .. // this is the code I need
Response.Redirect(url);

Я нашел этот вопрос, что частично подводит меня к этому, но не говорит мне, как передать токен в InfoView .NET. В некоторых старых документах также упоминается необходимость использования файла cookie. Я также нашел другие сайты, которые показывают, как передать его в Java InfoView, но мне нужна версия .NET.


person Kasey Speakman    schedule 09.01.2010    source источник


Ответы (2)


Я использовал это сообщение в качестве ссылки для этого решения.

Это решение состоит из двух частей.

  • A page in custom web app to create a CMS session
    • Because my web app knows the logged on user.
  • A page on the server to bypass the InfoView login
    • Because my web app can't set Session vars and Cookies for InfoView.

Вот шаги:

  1. Настройте страницу передачи в своем веб-приложении.
  2. Скопируйте нужную DLL на сервер.
  3. Настройте страницу обхода на сервере.

Страница передачи

  1. У вас должен быть установлен SDK Crystal Reports Server. Его можно установить с компакт-диска Crystal Reports Server (он называется клиентскими инструментами или чем-то подобным).
  2. Добавьте ссылку на проект в CrystalDecisions.Enterprise.Framework. Установите для него значение «Копировать локально» = «Истина».
  3. Создать страницу. Добавьте к нему кнопку. Добавьте событие OnClick к кнопке.
  4. Ссылка на пространство имен кода программной части страницы:

    using CrystalDecisions.Enterprise;
    
  5. Код события OnClick

    string username = "user";
    string password = "password";
    string server = "CMSNAME:6400";
    string auth_type = "secEnterprise";
    // logon
    SessionMgr session_mgr = new SessionMgr();
    EnterpriseSession session = session_mgr.Logon(username, password, server, auth_type);
    // get the serialized session
    string session_str = session.SerializedSession;
    // pass the session to our custom bypass page on the CRS
    string url = "http://reportserver.domain.com/InfoViewApp/transfer.aspx?session="
    url += HttpUtility.UrlEncode(session_str);
    Response.Redirect(url);
    

Скопируйте DLL

  1. Создайте проект, содержащий страницу Transfer.
  2. В папке проекта в разделе bin/Debug найдите файл: CrystalDecisions.Enterprise.Framework.dll и скопируйте его на сервер в папку: C:\Program Files\Business Objects\BusinessObjects Enterprise 12.0\Web Content\InfoViewApp\InfoViewApp\bin . Для Windows 2008 R2 вместо «Program Files» в пути должно быть «Program Files (x86)».

Страница обхода

  1. Откройте Блокнот на сервере и вставьте в него следующее.

    <%@ Page Language="C#" %>
    <script runat="server">
    private const string SESSION_PARAM = "session";
    private const string SESSION_KEY = "INFOVIEW_SESSION";
    private const string COOKIE_KEY = "InfoViewdotnetses";
    private const string LOGON_URL = "logon.aspx";
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (Request.QueryString[SESSION_PARAM] != null)
            {
                string sessionStrRaw = Request.QueryString[SESSION_PARAM];
                string sessionStr = System.Web.HttpUtility.UrlDecode(sessionStrRaw);
                CrystalDecisions.Enterprise.SessionMgr sessionMgr = new CrystalDecisions.Enterprise.SessionMgr();
                CrystalDecisions.Enterprise.EnterpriseSession entSession = sessionMgr.GetSession(sessionStr);
                BusinessObjects.Enterprise.Infoview.Common.CrystalIdentity identity;
                identity = new BusinessObjects.Enterprise.Infoview.Common.CrystalIdentity(entSession, System.Web.HttpContext.Current);
                HttpContext.Current.Session.Add(SESSION_KEY, identity);
                //Create the InfoViewdotnetses cookie which holds the SerializedSession
                HttpCookie InfoViewdotnetses = new HttpCookie(COOKIE_KEY);
                InfoViewdotnetses.Value = System.Web.HttpUtility.UrlEncode(sessionStrRaw);
                InfoViewdotnetses.Path = @"/";
                Response.Cookies.Add(InfoViewdotnetses);
            }
            Response.Redirect(LOGON_URL);
        }
        catch (Exception ex) { Response.Write(ex.ToString()); }
    }
    </script>
    
  2. Сохраните страницу как transfer.aspx в: C:\Program Files\Business Objects\BusinessObjects Enterprise 12.0\Web Content\InfoViewApp\InfoViewApp. (Для Windows 2008 R2 см. примечание выше.)

Вот и все. Это то, что сработало для меня.

person Kasey Speakman    schedule 14.01.2010
comment
Visual Studio 2017: stackoverflow.com/questions/42902740/ - person MacGyver; 10.04.2019

Это решит вашу проблему:

Скопируйте код в page_load aspx, чтобы передать маркер проверки подлинности в отчет.

    protected void Page_Load(object sender, EventArgs e)
    {
        string username = "user";
        string password = "password";
        string server = "<boe server>";
        string auth_type = "<auth type>";
        // e.g. string auth_type = "Windows AD"

        string token; string tokenEncoded; 

        int reportid = <reportid>; 
        string report_params = "<param1>=<value1>&<param2>=<value2>";

        // logon
        SessionMgr session_mgr = new SessionMgr();
        EnterpriseSession session = session_mgr.Logon(username, password, server, auth_type);

        // create token from session manager
        token = session.LogonTokenMgr.CreateLogonTokenEx("", 120, 100);
        tokenEncoded = HttpUtility.UrlEncode(token);

        // pass the token to the custom bypass page on the CRS
        string url = string.Format("http://{0}/OpenDocument/opendoc/openDocument.aspx?sIDType=wid&iDocID={1}&lsS{2}&token={3}",
            server, reportid, param, tokenEncoded);

        Response.Redirect(url);
    }
person Amit K Gupta    schedule 13.07.2011