微软专家:
Oliver Lu


一次登录,资源尽享(Single Sign-On)

微软专家专题讲座



很兴奋能够把微软的最新技术和大家一起分享,共同学习共同进步。^_^



Single Sing-On简介


微软已经推出了Office System,其中的SharePoint Portal Server 2003(以下简称SPS2003)可以用来快速地建立起一个门户网站,
可以使企业内用户轻易地找到所需要的信息,协同工作,同时,也可以向Internet上的用户提供一个信息查询的门户网站。
    如果用户的客户端和SPS2003服务器以及其他一些服务器(例如Exchange Server)在同一个域中,那么通过SPS2003的网站,访问其
他的信息是一件轻而易举的事情,但在很多时候,可能会遇到下面的问题:
1. 客户端并没有加入到域中,或者客户端通过虚拟专用网(VPN)接入公司网络。此时,在访问所有的服务器时,都需要输入用户信息。
2. 用户会使用一些第三方的产品,无法将这些服务器加入到域中。此时,即使登录了SPS2003的网站,在访问其他服务器的时候,还是
会出现需要用户信息的窗口。
    正是基于以上的需求,在SPS2003中,有一项新的功能—Single Sign On(以下简称SSO)。SSO的基本思想就是:
    建立一个加密的数据库,把用户的认证信息,存放到这个数据库中。当成功地验证了登录SPS2003网站的用户身份以后,就可以从
加密的数据库中,获得用户的信息,从而用来访问其他的服务器或者一些第三方的服务器。
    下面,我们来看看如何对上面提出的第一种情况—客户端不在域中的时候,使用SSO来达到登录SPS2003网站以后,就可以访问其他
域中的资源了。

怎样配置Single Sign-On

启用 Single Sign-On


在前端 Web 服务器、作业服务器和运行 Single Sign-on 服务的任何服务器上执行下列操作:
1.	在任务栏上,单击“开始”,指向“管理工具”,再单击“服务”。 
2.	在“服务”管理控制台上,双击“Microsoft Single Sign-on Service”。
3.	单击“登录”选项卡。
4.	在“登录帐户”下,单击“此帐户”。
5.	在“此帐户”框中,键入一个帐户名,该帐户应当是本地 Administrators 组的成员,或者是 STS_WPG 和 SPS_WPG 本地组的成员。
6.	在“密码”和“确认密码”框中,键入密码。
7.	单击“应用”。
8.	单击“常规”选项卡。
9.	在“启动类型”列表中,单击“自动”。
10.	在“服务状态”节中,如果服务状态没有显示“已启动”,请单击“启动”。
11.	单击“确定”。

指定 Single Sign-on 和应用程序定义的设置


1.	单击“开始”,指向“所有程序”,指向“SharePoint Portal Server”,再单击“SharePoint Portal Server Single Sign-On 管理”。
2.	在“管理 server_name 的 Single Sign-on 设置”页上的“服务器设置”节中,单击“管理服务器设置”。
3.	在“管理 Single Sign-on 的服务器设置”页上的“Single Sign-On 设置”节中,在“帐户名”框中,键入可以设置和管理 
Single Sign-on Service 的 Single Sign-On 管理员帐户。
该帐户可以为组帐户或单个用户帐户。它不能是本地域工作组或通讯组列表。
该帐户的格式是“域/用户组名”或“域/用户名”。
4.	在“企业应用程序定义设置”节中的“帐户名”框中,键入可以设置和管理应用程序定义的企业应用程序管理员帐户。 
该帐户可以为组帐户或单个用户帐户。它不能是本地域工作组或通讯组列表。
该帐户的格式是“域/用户组名”或“域/用户名”。
5.	在“数据库设置”节中,执行下列操作: 
1) 在“服务器名称”框中,键入要将 Single Sign-on 的设置和帐户信息存储在其中的数据库服务器的名称。 
2) 在“数据库名称”框中,键入 Single Sign-on 数据库的名称。 
6.	在“超时设置”节中,执行下列操作: 
1) 在“票证超时(分钟)”框中,键入票证或存取令牌超时之前等待的分钟数。 
2) 在“删除早于该时间的审核日志记录(天)”框中,键入删除记录之前需在审核日志中保存的天数。

注释  在指定的天数之后,审核日志将被覆盖。因为日志包含所有违法操作或登录尝试的记录,所以建议您保存这些日志的备份副本。
这些日志驻留在 Single Sign-on 数据库中,并且在备份该数据库时会自动备份。

7.	单击“确定”。 
8.	如果出现一个消息框,声明已经重新配置了 Single Sign-on,请单击“确定”。

创建加密密钥


1.	单击“开始”,指向“所有程序”,指向“SharePoint Portal Server”,再单击“SharePoint Portal Server Single Sign-On 管理”。
2.	在“管理 server_name 的 Single Sign-on 设置”页上的“服务器设置”部分中,单击“管理加密密钥”。 
3.	在“管理加密密钥”页的“加密密钥创建”部分中,单击“创建加密密钥”。 
4.	若要重新加密 Single Sign-On 数据库的凭据,请在“创建加密密钥”页上,选中“使用新加密密钥重新加密所有凭据”复选框,再单击“确定”。
要点  该操作运行时间较长。如果不用新加密密钥重新加密现有的凭据,则用户必须重新键入其凭据,应用程序定义的管理员必须重新键入组凭据。
5.	单击“确定”。

编辑应用程序定义


1.	单击“开始”,指向“所有程序”,指向“SharePoint Portal Server”,再单击“SharePoint Portal Server Single Sign-On 管理”。
2.	理服务器 server_name 的 Single Sign-on 设置”页上的“应用程序设置”部分中,单击“管理企业应用程序定义的设置”。 
3.	在“管理企业应用程序定义”页上,单击“新建项目”。
4.	在“编辑企业应用程序定义”页上的“应用程序和联系人信息”部分中,可编辑显示名称和电子邮件联系人。 
1)“显示名称”框中,键入该应用程序定义的显示名称。 
在我们现在的例子中,请使用“SSOApp”作为程序的名称。
2) 在“电子邮件联系人”框中,键入作为该应用程序联系人的用户的电子邮件地址。

5. 为账号类型选择“单独的”,这样的话对每一个用户都会存储一个用户信息。
6. 在“帐户信息”部分中,选择一个或多个要映射到该应用程序定义的必需登录信息的字段。
1) 为每个字段键入一个显示名称,以提醒您输入必需的信息。 
2) 为了确保在查看帐户信息时不会显示敏感性信息(如密码),请对“屏蔽?”单击“是”。

建议在我们的应用中,添加三个字段,分别按次序为UserName, Password和DomainName。

7.	单击“确定”。

管理应用程序定义的帐户信息


1. 单击“开始”,指向“所有程序”,指向“SharePoint Portal Server”,再单击“SharePoint Portal Server Single Sign-On 管理”。
2. 在“管理 server_name 的 Single Sign-on 设置”页上的“企业应用程序定义设置”部分中,单击“管理企业应用程序定义的帐户信息”。
3. 在“管理企业应用程序定义的帐户信息”页上的“帐户信息”部分中,执行下列操作: 
1) 在“企业应用程序定义”列表中,选择该应用程序定义的名称。 
2) 在“帐户名”或“组帐户名”框中,键入要修改的帐户名。 
4. 在“企业应用程序定义”部分中,可执行下列操作: 

更新该应用程序的帐户信息
1) 单击“更新帐户信息”。 
2) 单击“确定”。 
3) 在“提供 application_definition_name 帐户信息”页上的登录信息框中,键入可访问该应用程序的帐户的用户名。企业应用程序是一种
后端业务应用程序,SharePoint Portal Server 通过使用应用程序定义与之建立连接。 
4) 单击“确定”。

删除该应用程序的帐户信息
1) 单击“从此企业应用程序定义中删除为此帐户存储的凭据”。 
2) 单击“确定”。 
3) 若要删除用户凭据,请在确认消息框上单击“确定”。 

从所有应用程序定义中删除该帐户
1) 单击“从所有企业应用程序定义中删除为此帐户存储的凭据”。 
2) 单击“确定”。 
3) 若要从所有应用程序定义中删除用户凭据,请在确认消息框上单击“确定”。

在我们的应用中,我们需要为每一位要使用Single Sign-On的用户,建立一个账号信息。

创建使用SSO技术的Web Part


1.下载并安装Web Part Template for Visual Studio.NET
http://msdn.microsoft.com/library/en-us/dnspts/html/sharepoint_webparttemplates.asp


2. 打开Visual Studio.NET, 新建C#工程中的Web Part Library。

3. 将WebPart1.cs更名为“WPHttpRequest.cs”,并输入以下代码,代码的原理是使用WebRequest类以用户默认的身份信息向远端的URL发送请求,由于Single Sign-On的作用,原本此用户需要再次通过身份验证,现在只需要提供默认的身份信息便可以直接访问远端的主机。 首先我们要在项目的引用中,添加对Microsoft.Sharepoint.Portal.dll,Microsoft.Sharepoint.Portal.SingleSignon.dll的引用。

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Serialization;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.WebPartPages;

using Microsoft.SharePoint.Portal;
using Microsoft.SharePoint.Portal.SingleSignon;


//添加引用
using System.Net;
using System.IO;
//重新命名NameSpace为WPHttpRequest
namespace WPHttpRequest
{
	[DefaultProperty("Text"),
		ToolboxData("<{0}:HttpRequestWebPart runat=server></{0}:HttpRequestWebPart>"),
		XmlRoot(Namespace="WPHttpRequest")]
     //重新命名Class为WPHttpRequest
	public class HttpRequestWebPart : Microsoft.SharePoint.WebPartPages.WebPart
	{
		//定义私有变量
		private const string c_Url = "http://"; //目标URL
		private const string defaultText = "";
		private string text=defaultText;
		private string _myurl = "";
		[Category("Custom Properties")]
		[DefaultValue(c_Url)]
		[WebPartStorage(Storage.Personal)]
		[FriendlyNameAttribute("Url")]
		[Description("Type the Url here.")]
		[Browsable(true)]
		[XmlElement(ElementName="Url")]
          //定义属性
		public string Url //目标URL
		{
			get
			{
				return _myurl;
			}
			set
			{
				_myurl = value;
			}
		}


		[Browsable(true),Category("Miscellaneous"),
			DefaultValue(defaultText),
			WebPartStorage(Storage.Personal),
			FriendlyName("Text"),Description("Text Property")]
		public string Text
		{
			get
			{
				return text;
			}

			set
			{
				text = value;
			}
		}
		//重载RenderWebPart,并调用GetHttpRequestContent获取目标URL的内容
protected override void RenderWebPart(HtmlTextWriter output)
		{
			this.Text = GetHttpRequestContent(this.Url);  
output.Write(Text);
		}
          //获取远端页面的信息
		private string GetHttpRequestContent(string url)
		{
			string respstr = "";
			try
			{
				Uri contentUrl = new Uri(url);
				WebRequest req = WebRequest.Create(contentUrl);
				//设置预先验证用户权限
req.PreAuthenticate = true;
				//建立网络身份验证
				string[] rgGetCredentialData = null;

				Credentials.GetCredentials( 1,"SSOApp", ref rgGetCredentialData);

				System.Net.NetworkCredential mycredential = 
new System.Net.NetworkCredential(rgGetCredentialData[0],rgGetCredentialData[1],rgGetCredentialData[2]); 

				req.Credentials = mycredential;
                   //获取远端返回的文件流
				WebResponse resp = req.GetResponse();
				Stream stream = resp.GetResponseStream();
				StreamReader sr = new StreamReader(stream);
				//以字符串形式读取数据流
respstr = sr.ReadToEnd();
				sr.Close(); 
			}
			catch (Exception ex)
			{
				//返回错误信息
return "Error: " + ex.Message;
			}
			return respstr;
		}
	}
}


4.在VS.NET的命令窗口中运行“SN –k <YOUR_KEYFILE.snk>”。并修改AssemblyInfo.cs中的[assembly: AssemblyKeyFile(KEY_FILE_FULLPATH)],加入刚才生成的Key,签名生成的Web Part。 5.将“WebPart1.dwp”更名为“WPHttpRequest.dwp”并修改<Assembly>和<TypeName>,的设置使其指向WPHttpRequest Web Part的相关信息。

<?xml version="1.0" encoding="utf-8"?>
<WebPart xmlns="http://schemas.microsoft.com/WebPart/v2" >
<Title>HttpRequestWebPart</Title>
<Description>HttpRequestWebPart.</Description>
<Assembly>WPHttpRequest</Assembly>
<TypeName>WPHttpRequest.HttpRequestWebPart</TypeName>
<!-- Specify default values for any additional base class or custom properties here. -->
</WebPart>


6.打开Manifest.xml,如果没有在工程中添加任何资源,请直接删除配置文件的<ClassResources> <ClassResource FileName="" /> </ClassResources>段。修改并确认配置文件中的Assembly,SafeControl和DwpFile的设置,使之指向WPHttpRequest Web Part。

<?xml version="1.0"?>
<!-- You need to have just one manifest per CAB project for Web Part Deployment.-->
<!-- This manifest file can have multiple assembly nodes.-->
<WebPartManifest xmlns="http://schemas.microsoft.com/WebPart/v2/Manifest">
<Assemblies>
   <Assembly FileName="WPHttpRequest.dll">
     <SafeControls>
       <SafeControl
         Namespace="WPHttpRequest"
         TypeName="*"
       />
     </SafeControls>
   </Assembly>
</Assemblies>
<DwpFiles>
   <DwpFile FileName="WPHttpRequest.dwp"/>
</DwpFiles>
</WebPartManifest>


7.对该项目单击鼠标邮键,打开项目属性,确定其中“程序集”和“默认命名空间”都是“WPHttpRequest”,如不是,请都改成一致。 8.在同一个Solution中添加一个CAB安装包工程,加入该工程后,右键单击选择“添加”-〉“项目输出”,并在弹出的对话框中选择我们上面创建的WebPart工程,并选择加入“主输出”和“内容文件”两项。确定。 9.编译生成整个Solution,确认两个工程都成功编译。

添加Web Part


使用下面的方法,来部署和添加“WPHttpRequest.dwp”这个Web Part:

stsadm.exe –o addwppack –filename path_to_HTTPRequestCab.cab

1.	stsadm.exe 默认在/Program Files/Common Files/Microsoft Shared/Web Server Extensions/60/bin文件夹中。
2.	需要把path_to_HTTPRequestCab.cab改成具体的路径名称,例如C:/HttpRequestCAB.CAB
把C:/Inetpub/wwwroot/bin下的WPHttpRequest.dll文件,拷贝到C:/Windows/assembly目录中,同时,删除C:/Inetpub/wwwroot/bin下的WPHttpRequest.dll文件。

在成功地把这个Web Part添加到了SPS2003 Portal页面上以后,我们可以通过点击“编辑页面”-〉“修改共享页面”-〉“修改共享Web Parts”,
然后来编辑添加的这个Web Part。在个性化属性中,为URL添加一个地址,例如http://server/page.asp,然后点击确定。

相关文档


Microsoft.SharePoint.Portal.SingleSignOn Namespace
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/nsPortalSingleSignOn.asp


A Developer's Introduction to Web Parts


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnspts/html/sharepoint_northwindwebparts.asp


Code Access Security for Developers


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/smpscCodeAccessSecurityDevs.asp


Debugging Web Parts


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnspts/html/sharepoint_northwindwebparts.asp