sharepoint2010 单点登录 SSS
以下内容来自IT专家网:
对SSS进行初始配置
首先进入SharePoint 2010管理中心,在应用程序管理页面选择管理服务应用程序。
在服务应用程序页面,选择Secure Store Service,然后点击上方Ribbon区中的管理。
在初次进入SSS管理页面时,系统将提示我们“在创建新的安全存储目标应用程序之前,必须首先在功能区中为此 Secure Store Service 应用程序生成新密钥。”
该密钥将对我们存储在SSS数据库中的凭据信息进行加密和解密。
点击Ribbon区内的生成新密钥,在弹出窗口中为该密钥设置通行短语。
密钥生成后,SSS的初始配置便算是告一段落了。
创建目标应用程序
如果大家在SharePoint 2007中曾经使用过SSO的话应该对这部分的内容比较熟悉,关于创建目标应用程序的操作与2007相比并无很大区别。
首先还是进入我们的SSS实例的管理页面,在Ribbon区里的管理目标应用程序组中单击新建按钮进入创建新的安全存储目标应用程序页面。
我们需要设置目标应用程序的ID、显示名称、联系人电子邮件、目标应用程序类型这四个主要属性,其中比较重要的属性是目标应用程序ID和目标应用程序类型。ID是SSS用于识别此目标应用程序的唯一标识,目标应用程序类型主要分为个人和组两大类,如果选择个人则可以启用一个目标应用程序页,该页面将用于用户自行添加该目标应用程序的个人凭据。
因为在本例中要做的是用户与其个人邮箱间的映射,所以这里选择个人就好了,然后点击下一步。下面要做的就是设置将凭据提交到外部数据源时所要用到的字段了,默认情况下是用户名和密码两个字段。其中的已屏蔽选项表示当用户在输入该字段的值时将以屏蔽字符代替用户的输入字符,例如 *号。在本例中保持默认值就可以了。
最后还需要为此目标应用程序设置一个管理员。
OK,到了这里所有的配置工作就结束了,由于在SharePoint 2010中微软仍然没有提供一个可以out-of-box的WebPart,所以像07中一样,要实现单点登录的话还需要我们自己来开发一个WebPart。
创建单点登录WebPart
由于在SharePoint 2010中微软用SSS取代了以前的SSO,所以在2007中实现单点登录时所用的代码现在已经不能用了,需要用SP 2010中新的对象模型来完成这一功能。
使用VS2010创建一个空白SharePoint项目,然后添加一个可视Web部件。
接着在此项目中添加Microsoft.BussinessData和Microsoft.Office.SecureStoreService的引用。这里呢可能会出现一个问题,因为在\Microsoft Shared\Web Server Extensions\14\ISAPI这个目录下只有Microsoft.Office.SecureStoreService.Server.Security这个dll,需要我们自己到GAC中将Microsoft.Office.SecureStoreService这个dll拷贝出来才行。Microsoft.BussinessData可以在\Microsoft Shared\Web Server Extensions\14\ISAPI目录下找到。
通过下面这段代码可获得当前用户存储在SSS中的目标应用程序凭据。
以下是代码片段: 1 protected void Button1_Click(object sender, EventArgs e) 2 { 3 string m_userName = string.Empty; 4 string m_password = string.Empty; 5 string m_html = string.Empty; 6 string m_appId = "163Mail"; 7 SecureStoreProvider m_provider = new SecureStoreProvider(); 8 SPSite m_site = SPContext.Current.Site; 9 SPServiceContext m_serviceContext = SPServiceContext.GetContext(m_site); 10 m_provider.Context = m_serviceContext; 11 try 12 { 13 SecureStoreCredentialCollection m_sscc = m_provider.GetCredentials(m_appId); 14 foreach (SecureStoreCredential ssc in m_sscc) 15 { 16 switch (ssc.CredentialType) 17 { 18 case SecureStoreCredentialType.Generic: 19 break; 20 case SecureStoreCredentialType.Key: 21 break; 22 case SecureStoreCredentialType.Password: 23 m_password = ToClrString(ssc.Credential); 24 break; 25 case SecureStoreCredentialType.Pin: 26 break; 27 case SecureStoreCredentialType.UserName: 28 m_userName = ToClrString(ssc.Credential); 29 break; 30 case SecureStoreCredentialType.WindowsPassword: 31 break; 32 case SecureStoreCredentialType.WindowsUserName: 33 break; 34 default: 35 break; 36 } 37 } 38 m_html += "<script>"; 39 m_html += string.Format("window.location.href='http://reg.163.com/login.jsp?url=&type=1&product=&savelogin=&outfoxer=&domains=&syscheckcode=4ecd8fe3803494cff0df5414f321fd5f9afa4c78&username={0}%40163.com&password={1}&Submit='", m_userName, m_password); 40 m_html += "</script>"; 41 Response.Write(m_html); 42 } 43 catch (Exception ex) 44 { 45 Response.Write("<script>window.location.href= '/_layouts/SecureStoreSetCredentials.aspx?TargetAppId=" + m_appId + "';</script>"); 46 } 47 } |
完成后将WebPart部署到网站中,OK,结束~~~
下面是实际项目中获取存储的工号密码的的完整代码,比较简单也没写注释。
/// 根据系统ID获取存储的工号密码
/// </summary>
/// <param name="strAppID"></param>
/// <returns>name,pwd</returns>
public IList<string> GetSiteNameAndPwd(string m_appId)
{
IList<string> iListString = new List<string>();
SecureStoreProvider m_provider = new SecureStoreProvider();
SPSite m_site = SPContext.Current.Site;
SPServiceContext m_serviceContext = SPServiceContext.GetContext(m_site);
m_provider.Context = m_serviceContext;
try
{
if (m_appId.Length > 0)
{
SecureStoreCredentialCollection m_sscc = m_provider.GetCredentials(m_appId);
foreach (SecureStoreCredential ssc in m_sscc)
{
switch (ssc.CredentialType)
{
case SecureStoreCredentialType.Generic:
break;
case SecureStoreCredentialType.Key:
break;
case SecureStoreCredentialType.Pin:
break;
case SecureStoreCredentialType.Password:
iListString.Add(Encrypt(ToClrString(ssc.Credential), "SCECIURS"));
break;
case SecureStoreCredentialType.UserName:
iListString.Add(Encrypt(ToClrString(ssc.Credential), "SCECIURS"));
break;
case SecureStoreCredentialType.WindowsUserName:
iListString.Add(Encrypt(ToClrString(ssc.Credential), "SCECIURS"));
break;
case SecureStoreCredentialType.WindowsPassword:
iListString.Add(Encrypt(ToClrString(ssc.Credential), "SCECIURS"));
break;
default:
break;
}
}
}
}
catch (Exception ex)
{
}
return iListString;
}
/// <summary>
/// DEC 加密过程
/// </summary>
/// <param name="pToEncrypt">被加密的字符串</param>
/// <param name="sKey">密钥(只支持8个字节的密钥)</param>
/// <returns>加密后的字符串</returns>
public string Encrypt(string pToEncrypt, string sKey)
{
//访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);//把字符串放到byte数组中
MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流
//定义将数据流链接到加密转换的流
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
//上面已经完成了把加密后的结果放到内存中去
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
/// <summary>
/// DEC 解密过程
/// </summary>
/// <param name="pToDecrypt">被解密的字符串</param>
/// <param name="sKey">密钥(只支持8个字节的密钥,同前面的加密密钥相同)</param>
/// <returns>返回被解密的字符串</returns>
public string Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量,此值重要,不能修改
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
//建立StringBuild对象,createDecrypt使用的是流对象,必须把解密后的文本变成流对象
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}