Программный вход на сервер Crystal Reports - PullRequest
1 голос
/ 09 января 2010

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

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

Примерно так было бы неплохо (C #):

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

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

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

Ответы [ 2 ]

3 голосов
/ 15 января 2010

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

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

  • Страница в пользовательском веб-приложении для создания сеанса CMS
    • Поскольку мое веб-приложение знает пользователя, вошедшего в систему.
  • Страница на сервере для обхода входа в InfoView.
    • Поскольку мое веб-приложение не может устанавливать переменные сеанса и файлы cookie для 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. Создайте проект, содержащий страницу переноса.
  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 см. Примечание выше.)

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

1 голос
/ 13 июля 2011

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

Скопируйте код в 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);
    }
...