编程登录到Crystal Reports Server
-
19-09-2019 - |
题
我有一个使用表单身份验证的Web表单应用程序。我有一个Crystal Reports Server 2008 V1服务器,并安装了Infoview .NET并正常工作。我有一些企业帐户设置。编辑:我应该提到我的Web表单应用在与Crystal Reports Server不同的服务器上。
我需要知道如何在我的自定义ASP .NET页面(C#)上编程登录到Infoview .NET,然后将用户转移到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版本。
解决方案
我用了 这个帖子 作为此解决方案的参考。
该解决方案有两块。
- 自定义Web应用程序中的页面以创建CMS会话
- 因为我的网络应用程序知道登录用户的登录。
- 服务器上的页面绕过Infoview登录
- 因为我的Web应用程序无法为Infoview设置Session VAR和Cookie。
这是:
- 在您的Web应用程序中设置传输页面。
- 将所需的DLL复制到服务器上。
- 在服务器上设置旁路页面。
转移页面
- 您必须安装Crystal Reports Server SDK。它可以从Crystal Reports Server CD(称为客户端工具或类似的东西)中安装。
- 将项目参考添加到CrystalDecis.enterprise.framework中。将其设置为复制local = true。
- 创建一个页面。在其中添加一个按钮。在按钮中添加一个onclick事件。
页面代码命名命名空间参考:
using CrystalDecisions.Enterprise;
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
- 构建包含转移页面的项目。
- 在项目文件夹中,在bin/debug下,查找文件:crystaldecisisions.enterprise.framework.dll,然后将其复制到服务器中:c:c: program files businessObjects businessObjects enthprise enterprise 12.0 web content infoviewapp infoviewapp infoviewapp infoviewapp infoviewapp bin bin bin bin bin bin bin bin 。 对于Windows 2008 R2, ,路径中的“程序文件”应该为“程序文件(x86)”。
旁路页面
在服务器上打开记事本,然后将以下内容粘贴到其中。
<%@ 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>
将页面作为trass.aspx保存到:c: program文件 business对象 businessObjects enterprise 12.0 web content infoviewapp infoviewapp。 (对于Windows 2008 R2,请参见上面的注释。)
而已。这就是对我有用的原因。
其他提示
这将解决您的问题:
将代码复制到ASPX的PAGE_LOAD,将身份验证的令牌传递给报告。
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);
}
不隶属于 StackOverflow