在这部分中,我将向大家介绍怎么来取得存放在SSO数据库中的用户名和密码,并使用它们进行POST提交登陆。
思路是这样的,在MOSS中创建一个aspx页面,重写这个页面的Page_Load事件,也许你会说,MOSS页面里不能使用服务器端代码,鸡蛋石头飞来~~~呵呵,关于这方面的介绍,请参考我的另一个帖子:向MOSS页面中添加服务器端代码的另外一种方式,http://bbs.winos.cn/thread-48297-1-1.html,在Page_Load事件中,只有几行代码,根据当前登陆域帐户去取第三方系统Form认证的用户名和密码(在我这里是Mantis),并赋值给这个aspx页面的用户名和密码的输入框中,这两个是隐藏的,然后再在windows的onload事件中,执行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"是一个编码格式的问题,我在Post到mantis时需要,对你并不一定是必须的。引用之后,我们就可以写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>
其中,username和password是我们页面上的两个服务器端控件,下面就是我们构建的模拟提交的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地址,如图:
第一行就是Post的地址,第二行是在登陆成功后转至的地址,我们需要的就是这两个。
然后我们再查看一下页面的源文件,找到Form的名字及输入用户名和密码的两个文本框,在Mantis里是login_form 、username和password,就用这三个名字来分别命名我们页面上的控件。
到这里,我们已经完成了根据当前登陆的域帐户取得Mantis里的用户名和密码,并赋值到页面中,现在需要做的只是在windows.onload时,将页面提交出去。
在Form的下面,我们这样来写:
<script type="text/javascript">
window.οnlοad=function (){document.login_form.submit();};
</script>
这样完成之后,当登陆的域用户打开上面这个页面后,页面会自动找到与该用户对应的Mantis用户名和密码,并自动Post提交登陆,从而跳过Mantis的login界面。
既然是单点登陆,就会有密码同步的问题。细心的朋友肯定会发现,当修改了第三方系统的密码后,上面这个单点登陆肯定就不行了,这是肯定的,因为我们在SSO数据库里存放的匹配密码并没有做相应修改,这部分内容我正在琢磨,怎么实现比较好。初步的设想是用Webservices来修改存放在SSO数据库里的密码,当第三方系统中的密码发生变化后,调用这个Webservices里的方法来修改SSO数据库。