【原】Web intelligence数据分析报表(四):单点登陆(SSO)
需求:不考虑BO报表的权限,能够通过URL地址直接访问webi报表,而且要部署简单。
这种需求貌似免登陆方式查看报表。根据BO技术支持提供的资料以.net方案,这种方案可以解决这种问题,但是不够简练,在我看来做二次开发比较好。这个方案大体思路是这样:通过.net调用BO的API实现登陆,以及文档资源的读取,以及权限的验证等等。BO基于浏览其设计验证核心是通过Session和BO的Token进行权限验证的。这种方式不过多地介绍,如果买了正版BO,这些资料解决方案都会有的。在拿到这个需求时,我的想法就是能够利用BO对.net支持,直接使用他内置浏览功能,那样不是更好!比如BO内置的.net虚拟目录就有opendocument.aspx文件,以及webi设计浏览功能。要解决就是怎么登陆到BO就可以了。
仔细查看webi设计基于浏览器IIS虚拟目录Infoview(在businessobjects>enterprise115>infoview)这个地方就是我们设计运行程序目录。可以看到logon.aspx就是登陆BO文件,如果绕过或者使用隐含方式进行登陆,就可以通过opendocument.aspx进行报表浏览。绕过登陆去浏览报表,那是不太可能的,因为BO对报表操作浏览采用权限验证方式,研究这个API接口耗时,意义也不大。于是乎我就想造一个aspx文件直接通过它隐含登陆(隐含登陆就是没有登陆界面,直接读取帐户信息登陆)。那为什么可以浏览报表呢,这就是我前面说到的BO基于浏览器设计是通过Session或者Token参数来进行用户信息验证的。如果设计的隐含登陆aspx文件可以设置Session那样,不就Ok了!实践证明,确实可以。具体方法如下:
1. 基本思路是,通过一个aspx文件读取配置心中BO登陆信息,然后登陆,获取设置Session值,最后通过参数化拼接opendocument.aspxURL字符串,重定向到该路径就可以了。
2. 用vs创建一个解决方案,添加一个aspx文件,如:BOSSO.aspx
3. 在Page_Load添加如下代码
string strReportUrl = string.Empty;
// opendocument.aspx 的服务器浏览路径
string strPath = ConfigurationManager.AppSettings["BOPath"];
// 服务器系统
string strSystem = ConfigurationManager.AppSettings["BOSystem"];
// 用户
string strUser = ConfigurationManager.AppSettings["BOUser"];
// 密码
string strPassword = ConfigurationManager.AppSettings["BOPassword"];
// 报表ID
string strDocID = Request.QueryString["DocID"];
// 拼接ReportUrl
strReportUrl = strPath + "?sIDTyp=CUID&sType=wid&iDocID=" + strDocID;
// BO登陆认证
//获取Session有两种方式
// 第一种
CrystalDecisions.Enterprise.WebControls.Identity MainIdentity = new CrystalDecisions.Enterprise.WebControls.Identity();
bool Success = MainIdentity.Logon(strUser, strPassword, strSystem, "Enterprise");
// 第二种
//SessionMgr sessionMgr = new SessionMgr();
//EnterpriseSession enterpriseSession = sessionMgr.Logon(user.Value, password.Value, CMS.Value, auth_type.Value);
//Session["CE_ENTERPRISESESSION"] = enterpriseSession;
if (Success)
{
// 存入Session
HttpContext.Current.Session["CE_ENTERPRISESESSION"] = MainIdentity.EnterpriseSession;
if (String.IsNullOrEmpty(strDocID)!=true)
{
Response.Redirect(strReportUrl, false);
}
else
{
Response.Write("<script language='javascript'>alert("'Please input docID!"');</script>");
}
}
else
{
Response.Redirect("Logon.aspx", false);
}
这段代码很好理解,不多说明了
4. 然后编译生成dll程序集,将dll程序集拷贝到infoview的bin目录下,将BOSSO.aspx拷贝到infoview目录下,同时在infoview下web.config配置文件中的appSettings配置添加上述几个节点。
5. 需要注意的是:重起一下IIS,对BOE XLR2版本必须将infoview目录设置为asp.net2.0。
6. 现在你就可以直接通过访问BOSSO.aspx访问报表了,如:http://192.168.1.75/businessobjects/Enterprise115/InfoView/BOSSO.aspx?docID=5091,DocID就是webi文档的CURD
浙公网安备 33010602011771号