当前位置: 首页 > news >正文

一起谈.NET技术,SharePoint 2010中的单点登录

  在SharePoint 2007时代我们可以通过Microsoft Single Sign-on Service来实现单点登录,但到了SharePoint 2010中不再有Single Sign-on这个服务了,取而代之的则是Secure Store Service简称SSS。与以前的SSO一样,SSS也提供了一个数据库实例来保存用于访问某些外部应用程序或外部数据源的用户凭据信息,所不同的是我们不仅可以使用SSS中保存的凭据信息来实现单点登录,同时BDC、Excel Service等服务应用程序现在也可使用SSS中保存的凭据来访问外部数据源。接下来的内容中小弟我将对如何使用SSS实现单点登录进行详细的说明。

  与2007相同的是在SP 2010中要实现单点登录依然需要我们写代码来实现,不过在这之前还需要对场中的SSS服务进行初始配置。

  对SSS进行初始配置

  首先进入SharePoint 2010管理中心,在应用程序管理页面选择管理服务应用程序。

image  在服务应用程序页面,选择Secure Store Service,然后点击上方Ribbon区中的管理。

image  在初次进入SSS管理页面时,系统将提示我们“在创建新的安全存储目标应用程序之前,必须首先在功能区中为此 Secure Store Service 应用程序生成新密钥。”

  该密钥将对我们存储在SSS数据库中的凭据信息进行加密和解密。

image  点击Ribbon区内的生成新密钥,在弹出窗口中为该密钥设置通行短语。

image  密钥生成后,SSS的初始配置便算是告一段落了。

  创建目标应用程序

  如果大家在SharePoint 2007中曾经使用过SSO的话应该对这部分的内容比较熟悉,关于创建目标应用程序的操作与2007相比并无很大区别。

  首先还是进入我们的SSS实例的管理页面,在Ribbon区里的管理目标应用程序组中单击新建按钮进入创建新的安全存储目标应用程序页面。

image  我们需要设置目标应用程序的ID、显示名称、联系人电子邮件、目标应用程序类型这四个主要属性,其中比较重要的属性是目标应用程序ID和目标应用程序类型。ID是SSS用于识别此目标应用程序的唯一标识,目标应用程序类型主要分为个人和组两大类,如果选择个人则可以启用一个目标应用程序页,该页面将用于用户自行添加该目标应用程序的个人凭据。

  因为在本例中要做的是用户与其个人邮箱间的映射,所以这里选择个人就好了,然后点击下一步。下面要做的就是设置将凭据提交到外部数据源时所要用到的字段了,默认情况下是用户名和密码两个字段。其中的已屏蔽选项表示当用户在输入该字段的值时将以屏蔽字符代替用户的输入字符,例如 *号。在本例中保持默认值就可以了。

image  最后还需要为此目标应用程序设置一个管理员。

image  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拷贝出来才行,可以参看http://support.microsoft.com/kb/982263。Microsoft.BussinessData可以在\Microsoft Shared\Web Server Extensions\14\ISAPI目录下找到。

  通过下面这段代码可获得当前用户存储在SSS中的目标应用程序凭据。


  
protected void Button1_Click( object sender, EventArgs e)
{
string m_userName = string .Empty;
string m_password = string .Empty;
string m_html = string .Empty;
string m_appId = " 163Mail " ;
SecureStoreProvider m_provider
= new SecureStoreProvider();
SPSite m_site
= SPContext.Current.Site;
SPServiceContext m_serviceContext
= SPServiceContext.GetContext(m_site);
m_provider.Context
= m_serviceContext;
try
{
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.Password:
m_password
= ToClrString(ssc.Credential);
break ;
case SecureStoreCredentialType.Pin:
break ;
case SecureStoreCredentialType.UserName:
m_userName
= ToClrString(ssc.Credential);
break ;
case SecureStoreCredentialType.WindowsPassword:
break ;
case SecureStoreCredentialType.WindowsUserName:
break ;
default :
break ;
}
}
m_html
+= " <script> " ;
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);
m_html
+= " </script> " ;
Response.Write(m_html);
}
catch (Exception ex)
{
Response.Write(
" <script>window.location.href= '/_layouts/SecureStoreSetCredentials.aspx?TargetAppId= " + m_appId + " ';</script> " );
}
}

  完成后将WebPart部署到网站中,OK,结束~~~

image  面是本示例的完整代码,比较简单也没写注释,大伙凑乎着看吧。


  
using System;
using System.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.Office.SecureStoreService.Server;
using Microsoft.BusinessData.Infrastructure.SecureStore;
namespace SP2010SingleSignOnWebPart.SingleSignOnWebPart
{
public partial class SingleSignOnWebPartUserControl : UserControl
{
protected void Button1_Click( object sender, EventArgs e)
{
string m_userName = string .Empty;
string m_password = string .Empty;
string m_html = string .Empty;
string m_appId = " 163Mail " ;
SecureStoreProvider m_provider
= new SecureStoreProvider();
SPSite m_site
= SPContext.Current.Site;
SPServiceContext m_serviceContext
= SPServiceContext.GetContext(m_site);
m_provider.Context
= m_serviceContext;
try
{
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.Password:
m_password
= ToClrString(ssc.Credential);
break ;
case SecureStoreCredentialType.Pin:
break ;
case SecureStoreCredentialType.UserName:
m_userName
= ToClrString(ssc.Credential);
break ;
case SecureStoreCredentialType.WindowsPassword:
break ;
case SecureStoreCredentialType.WindowsUserName:
break ;
default :
break ;
}
}
m_html
+= " <script> " ;
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);
m_html
+= " </script> " ;
Response.Write(m_html);
}
catch (Exception ex)
{
Response.Write(
" <script>window.location.href= '/_layouts/SecureStoreSetCredentials.aspx?TargetAppId= " + m_appId + " ';</script> " );
}
}
internal string ToClrString(SecureString p_string)
{
var m_ptr
= System.Runtime.InteropServices.Marshal.SecureStringToBSTR(p_string);
try
{
return System.Runtime.InteropServices.Marshal.PtrToStringBSTR(m_ptr);
}
finally
{
System.Runtime.InteropServices.Marshal.FreeBSTR(m_ptr);
}
}
}
}

   

相关文章:

  • 使用 Iframe实现跨域通信
  • 一起谈.NET技术,Silverlight 游戏开发小技巧:升级和传送点特效1
  • TFS创建团队项目(三)
  • 【编译打包】tengine 1.5.1 SRPM
  • Android中文API(130) —— Html
  • PHP7 学习笔记(十)会话控制
  • 压力测试的轻量级具体做法
  • 朝着微服务的方向去做一次数据库拆分
  • apache 开机自启动
  • MongoDB的监控首选:mongostat
  • 采用交换机和HUB连接局域网有什么区别?
  • 进行高效数字化转型工作的7个习惯
  • Microsoft Dynamics AX 2012 正式版虚拟机
  • Python学习笔记-实现探测Web服务质量
  • 隐藏文件无法取消隐藏属性的解决[转]
  • [Vue CLI 3] 配置解析之 css.extract
  • docker容器内的网络抓包
  • Javascript Math对象和Date对象常用方法详解
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node学习系列之简单文件上传
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Twitter赢在开放,三年创造奇迹
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 不上全站https的网站你们就等着被恶心死吧
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 大型网站性能监测、分析与优化常见问题QA
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 翻译:Hystrix - How To Use
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 力扣(LeetCode)357
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端攻城师
  • 前端面试之闭包
  • 容器服务kubernetes弹性伸缩高级用法
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 与 ConTeXt MkIV 官方文档的接驳
  • 阿里云移动端播放器高级功能介绍
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​你们这样子,耽误我的工作进度怎么办?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (06)Hive——正则表达式
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)Linux下编译安装log4cxx
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • /etc/shadow字段详解
  • [ solr入门 ] - 利用solrJ进行检索