.NET跨域单点登录

编辑
  • 文档创建者:文档助手1
  • 浏览次数:5412次
  • 编辑次数:16次
  • 最近更新:susie 于 2019-06-11
  • 1. 问题描述

    .Net 系统集成有自己独立的登录验证方式,跟报表集成时,不需要再使用报表内置的登录界面,只需要将报表默认的参数用户名 fr_username 和密码 fr_password 发送给报表系统,触发一下报表验证方式就可以实现单点登录了,如下详细步骤:

    2. 实现思路

    下图为单点登录平台的登录系统界面(非 FR 的数据决策系统登录界面):

    2.1 触发报表验证方法

    报表集成时不需要再一次进行登录验证,只需在项目里面的登录验证页面内触发一下报表方法,如下 JS 方法:


     function doSubmit() {    
             var username =document.getElementById("username").value;  //此处是用来提取用户名和密码
             var password =document.getElementById("userPwd").value;
            var scr = document.createElement("iframe");      //创建 iframe  
             var dt=new Date();
            scr.src = "/webroot/decision/view/report?op=fs_load&cmd=sso&fr_username=" + username + "&fr_password=" + password+"&time="+dt.toString();   //将报表验证用户名密码的地址指向此iframe  
            document.getElementsByTagName("head")[0].appendChild(scr);   //将 iframe 标签嵌入到 head 中  
        }

    详细可查看 平台系统单点登录接口

    2.2 实现过程

    点击项目里面的登录按钮,跳到后台进行项目里面的验证,而我们报表的验证方式需要在页面前台内调用 JavaScript 的方式触发,这边类似定义了两个 onclick 事件,而 .Net 不能同时触发两个 onclick 事件,所以先要触发完一个 onclick 事件后再触发另一个,考虑报表没有验证完 .Net 项目就跳转的话,导致报表没有验证成功,所以点击登录按钮首先触发报表验证方法,其次再到 .Net 后台进行验证。

    2.3 触发 .Net 前台

    触发前台报表验证方法,新建一个登录按钮,设置按钮 OnClientClick 属性为:OnClientClick="doSubmit();return false;",即触发前台 doSubmit() 方法,doSubmit() 方法,首先把获取的用户名和密码的值,发送到报表系统,报表服务将带着这两个参数访问认证地址进行认证。而项目本身有个登录按钮是触发的项目后台的方法,我们这边首先触发报表前台再通过 JS 的方式触发后台的那个登录按钮,所以这边需要把之前的登录按钮设置隐藏,属性为 Style="display: none;"

    2.4 触发 .Net 后台

    报表验证完再触发 .Net 项目后台登录验证的方法,通过登录按钮 ID 为Button1,使用 document.getElementById("Button1").click();触发登录按钮,但是每个浏览器执行的方式不同,所以这边需要判断一下,代码如下:


         if (scr.attachEvent){       //判断是否为ie浏览器  
                   scr.attachEvent("onload", function(){                    //如果为ie浏览器则页面加载完成后立即执行  
                       var f = document.getElementById("Button1");  
                       f.click();  
                   });  
                } else {  
                   scr.onload = function(){              //其他浏览器则重新加载onload事件  
                        var f = document.getElementById("Button1");  
                        f.click();  
                   };  
             }

    3. 示例

    3.1 登录前台页面

    下面以简单的登录验证页面 login.aspx 为例,head中调用 JavaScript 触发报表方法:


    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="login.aspx.cs" Inherits="login" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
      <script type="text/javascript" language="javascript">  
           function doSubmit() {    
             var username =document.getElementById("username").value;  //此处是用来提取用户名和密码
             var password =document.getElementById("userPwd").value;
            var scr = document.createElement("iframe");      //创建 iframe  
             var dt=new Date();
            scr.src = "/webroot/decision/view/report?op=fs_load&cmd=sso&fr_username=" + username + "&fr_password=" + password+"&time="+dt.toString();   //将报表验证用户名密码的地址指向此iframe  
            if (scr.attachEvent){       //判断是否为 IE 浏览器  
                   scr.attachEvent("onload", function(){                    //如果为 IE 浏览器则页面加载完成后立即执行  
                       var f = document.getElementById("Button1");  
                       f.click();  
                   });  
                } else {  
                   scr.onload = function(){              //其他浏览器则重新加载 onload 事件  
                        var f = document.getElementById("Button1");  
                        f.click();  
                   };  
             }  
            document.getElementsByTagName("head")[0].appendChild(scr);   //将 iframe 标签嵌入到 head 中  
        } 
      </script>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:TextBox ID="username" runat="server" Style="z-index: 100; left: 156px; position: absolute;
                top: 42px"></asp:TextBox>
            <asp:TextBox ID="userPwd" runat="server" Style="z-index: 101; left: 157px; position: absolute;
                top: 91px"></asp:TextBox>
            <asp:Label ID="Label1" runat="server" Height="22px" Style="z-index: 102; left: 76px;
                position: absolute; top: 46px" Text="用户名:" Width="77px"></asp:Label>
            <asp:Label ID="Label2" runat="server" Style="z-index: 103; left: 80px; position: absolute;
                top: 88px" Text="密码:" Width="64px"></asp:Label>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Style="z-index: 104; display:none;
                left: 84px; position: absolute; top: 132px" Text="登录" Width="66px" />
            <asp:Button ID="Button2" runat="server" OnClientClick="doSubmit();return false;"
                Style="z-index: 106; left: 178px; position: absolute; top: 133px" Text="登录" Width="100px" />
        
        </div>
        </form>
    </body>
    </html>

    前台和后台验证成功之后,单点登录页面就设计完成了。

    报表通过 URL 传用户名和密码进行验证,传到报表服务器是以 Session 的方式保存,防止被人中途拦截会导致系统泄密,可以对登录进来的密码进行加密,可参考文档 简单权限之密码加密;或者使用 https 证书,让请求在传输过程中加密,配置方法也很简单,修改下服务器的配置文件就行了。这种方式还存在一个证书合法性问题,用自己生成的证书,客户端在访问报表中浏览器会显示证书非法警告,所以需要去购买合法证书。目前国内最便宜的证书一年是一千多元。

    3.2 注销用户

    当注销项目用户时,同时也希望注销报表用户名的 Session,这时可在点击退出按钮时调用一下报表登出方法:/webroot/decision/view/report?op=fs_load&cmd=ssout就可以实现 FR报表的退出登录。

    3.3 平台设置

    一般情况下报表集成到 .Net 系统,首先登录访问 .Net 的项目,所以自定义登录页面访问地址可以不需要设置,如果没有登录到 .Net 项目,先访问我们的报表了,而这时访问报表的登录页面是报表内置的登录界面,需使用自动登录页面地址为您系统的登录地址,操作如下:

    打开http://localhost/webroot/decision/view/report?op=fs,FR 管理平台,选择权限配置>登录设置,自定义登录页面访问地址上,输入自己的登录页面路径http://localhost/FRtest/login.aspx,如下图所示:

    注:若使用项目登录界面的话,必须要把是否使用 FineReport 内置登录页面后面的勾去掉。

    验证成功后跳转页面:指定义好权限后,用户访问系统,若他是直接输入的登录地址,那么登录成功后会自动跳转到指定的页面,若他是访问报表系统中的其他地址,比如访问的是一张模板,那么若该用户没有登录过,会先弹出登录界面,登录成功后跳转到访问的那个地址。


    附件列表


    主题: 部署集成
    标签: 暂无标签 编辑/添加标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]