[英]Programmatic Logon to Crystal Reports Server
I have a Web Forms app that uses forms authentication. 我有一个使用表单身份验证的Web窗体应用程序。 I have a Crystal Reports Server 2008 V1 server with InfoView .NET installed and working. 我有一个Crystal Reports Server 2008 V1服务器,安装并运行InfoView .NET。 I have some Enterprise accounts setup. 我有一些企业帐户设置。 EDIT: I should mention that my Web Forms app is on a different server from Crystal Reports Server. 编辑:我应该提到我的Web窗体应用程序与Crystal Reports Server位于不同的服务器上。
I need to know how to log on to InfoView .NET programmatically on my custom ASP .NET page (C#) and then transfer the user to InfoView without them having to type in the logon information. 我需要知道如何在我的自定义ASP .NET页面(C#)上以编程方式登录InfoView .NET,然后将用户转移到InfoView,而无需输入登录信息。
Something like this would be nice (C#): 像这样的东西会很好(C#):
string username = "blah";
string password = "asdf";
// create logon token for crystal reports server
// .. // this is the code I need
Response.Redirect(url);
I did find this question , which gets me partway there, but it doesn't tell me how to pass the token to InfoView .NET. 我确实找到了这个问题 ,它让我在那里,但它并没有告诉我如何将令牌传递给InfoView .NET。 Some older docs also mention needing a cookie. 一些较旧的文档也提到需要cookie。 I've also found other sites that show how to pass it to Java InfoView, but I need the .NET version. 我还发现其他网站显示如何将其传递给Java InfoView,但我需要.NET版本。
I used this post as reference for this solution. 我用这篇文章作为这个解决方案的参考。
There are two pieces to this solution. 这个解决方案有两个部分。
Here are the steps: 以下是步骤:
Page code-behind namespace reference: 页面代码隐藏命名空间参考:
using CrystalDecisions.Enterprise;
OnClick event code 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);
Open Notepad on the server and paste the following into it. 在服务器上打开记事本并将以下内容粘贴到其中。
<%@ 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>
Save the page as transfer.aspx into: C:\\Program Files\\Business Objects\\BusinessObjects Enterprise 12.0\\Web Content\\InfoViewApp\\InfoViewApp. 将页面保存为transfer.aspx到:C:\\ Program Files \\ Business Objects \\ BusinessObjects Enterprise 12.0 \\ Web Content \\ InfoViewApp \\ InfoViewApp。 (For Windows 2008 R2, see note above.) (对于Windows 2008 R2,请参阅上面的注释。)
That's it. 而已。 That's what worked for me. 这对我有用。
This will resolve your problem: 这将解决您的问题:
Copy the code to page_load of the aspx to pass the authenticated token to the report. 将代码复制到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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.