zoukankan      html  css  js  c++  java
  • 利用MOSS的SSO实现单点登陆[代码]zt

    在这部分中,我将向大家介绍怎么来取得存放在SSO数据库中的用户名和密码,并使用它们进行POST提交登陆。

        思路是这样的,在MOSS中创建一个aspx页面,重写这个页面的Page_Load事件,也许你会说,MOSS页面里不能使用服务器端代码,鸡蛋石头飞来~~~呵呵,关于这方面的介绍,请参考我的另一个帖子:向MOSS页面中添加服务器端代码的另外一种方式,http://bbs.winos.cn/thread-48297-1-1.html,在Page_Load事件中,只有几行代码,根据当前登陆域帐户去取第三方系统Form认证的用户名和密码(在我这里是Mantis),并赋值给这个aspx页面的用户名和密码的输入框中,这两个是隐藏的,然后再在windowsonload事件中,执行aspx页面上Form的提交操作。以前看过有人做的OWA访问邮箱的webpart其实也是这种思路,大家都知道,MOSS自带的那个OWA webpart基本没有使用价值。

    那我们就一步步来。首先创建一个aspx页面,这个页面完成模拟Post提交的工作,用Designer打开MOSS站点,测试的时候,我直接在站点的根路径下创建的这个页面,需要引用三个命名空间,在aspx页面顶部我们这样来写:

    <%@ Page Language="c#" CodePage="936"%>

    <%@ Import Namespace="Microsoft.SharePoint" %>

    <%@ Import Namespace="Microsoft.SharePoint.Portal" %>

    <%@ Import Namespace="Microsoft.SharePoint.Portal.SingleSignon" %>

    第一行的CodePage="936"是一个编码格式的问题,我在Postmantis时需要,对你并不一定是必须的。引用之后,我们就可以写Page_Load事件了,这段代码我是参考网上一哥们写的,可以拿去直接使用:

      <script type="text/c#" runat="server">

         protected void Page_Load(object sender, EventArgs e)

        {

           IntPtr pUserName = IntPtr.Zero;

           IntPtr pPassword = IntPtr.Zero;

           ISsoProvider isso = SsoProviderFactory.GetSsoProvider();

           SsoCredentials myCreds = isso.GetCredentials("mantis");//第一部分提到的应用程序名字,我这是mantis

           pUserName = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(myCreds.UserName);

           String userName = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pUserName);

           pPassword = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(myCreds.Password);

           String passWord = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(pPassword);

           this.username.Value = userName;

           this.password.Value = passWord;

        }

      </script>

    其中,usernamepassword是我们页面上的两个服务器端控件,下面就是我们构建的模拟提交的Form:

    <form action="Post的地址" method="POST" name="登陆页面Form名字 " autocomplete="off">

            <input type="hidden" name="return" value="Post成功后的地址">

            <input name="username" runat="server" id="username" type="hidden">

            <input name="password" runat="server" id="password" type="hidden">

    </form>

    当然,你可能不知道一个第三方系统Post到哪里去,我们需要借助一个IE插件HttpWatch来分析一下,点击插件的Record,当我们再点登陆的时候,就会看到我们需要的post地址,如图:

    1.jpg

    第一行就是Post的地址,第二行是在登陆成功后转至的地址,我们需要的就是这两个。

    然后我们再查看一下页面的源文件,找到Form的名字及输入用户名和密码的两个文本框,在Mantis里是login_form usernamepassword,就用这三个名字来分别命名我们页面上的控件。

    到这里,我们已经完成了根据当前登陆的域帐户取得Mantis里的用户名和密码,并赋值到页面中,现在需要做的只是在windows.onload时,将页面提交出去。

    Form的下面,我们这样来写:

    <script type="text/javascript">

           window.onload=function (){document.login_form.submit();};

          </script>

    这样完成之后,当登陆的域用户打开上面这个页面后,页面会自动找到与该用户对应的Mantis用户名和密码,并自动Post提交登陆,从而跳过Mantislogin界面。

    既然是单点登陆,就会有密码同步的问题。细心的朋友肯定会发现,当修改了第三方系统的密码后,上面这个单点登陆肯定就不行了,这是肯定的,因为我们在SSO数据库里存放的匹配密码并没有做相应修改,这部分内容我正在琢磨,怎么实现比较好。初步的设想是用Webservices来修改存放在SSO数据库里的密码,当第三方系统中的密码发生变化后,调用这个Webservices里的方法来修改SSO数据库。

       

       

    从 <http://www.mosstec.cn/html/c23/2009-12/4390.htm> 插入

  • 相关阅读:
    cat n个文件 June
    promise 码农
    [Linux]加载iso文件,并绑定到FTP共享
    [Linux]解决一例多个硬盘Linux启动的问题
    [CentOS]创建yum本地源
    [Java]服务器端用 Axis1.4 返回复杂对象记录
    [chs]Axis2 Binary Distribution 安装指南
    [CentOS]开启yum缓存
    [转]CSS hack总结
    闭包匿名闭包
  • 原文地址:https://www.cnblogs.com/gill/p/1745428.html
Copyright © 2011-2022 走看看