当前位置: 首页 > 编程日记 > 正文

SharePoint 2010 单点登录

SharePoint2010单点登录

1.进入管理中心》应用程序管理

2.找到  Secure Store Service 应用程序代理

3.然后就是新建了

5.输入网站集管理员

6.这个时候SharePoint就知道你需要给OA这个系统做单点登录了。

7.下一步就是我们要把我们进OA系统的帐号密码告诉SharePoint,让他记住当前登录域账户所存的OA账户。

8.下面我们模拟一下OA系统登录页面

复制代码
<html>
<body>
<form id=form1 action='dologin.aspx'> <input type='text' name='name'/> <input type='password' name='pwd'/><input type='submit' value='login'/> </form> </body> </html>
复制代码

9.OA的主页是http://OA/index.aspx 这是一个简单的登录页面代码,我们从代码得知,

这个form要提交的页面是 http://OA/dologin.aspx  ,

登录名name

密码pwd

那我们登录也需要这几个元素。在我们的moss中创建一个列表SSOList。

应用程序名称,就是一个显示用的,好让你知道是啥系统,SSPkey就是我们前面创建的OA 唯一标识。。。你懂得。

那下一步我们就该写代码了。

先整理下思路,我要先在SSOList这个列表中读出来我们登录的系统。

比如读取列表 然后拼出来,这个你懂得,我就不写了。

我们有OA的登录信息了,也有在管理中心建立OA了,那一步我们是不是改往SSO里面存储登录的帐号密码了?

比如我们OA的账户:zhangsan密码:123456

这个时候我们创建一个webpart。然后创建一个应用程序页面 aspx。

这个页面是专门来存账户和密码的

复制代码
/// <summary>         /// 在SSO中存储当前登录用户的配置的第三方系统单点登录的帐号和密码         /// </summary> /// <param name="ssosetting"></param> private void InsertSSO(string ssokey,string loginname,string loginpwd) { string userloginname = SPContext.Current.Web.CurrentUser.LoginName; if (!string.IsNullOrEmpty(ssokey) && !string.IsNullOrEmpty(loginname) && !string.IsNullOrEmpty(loginpwd)) { string[] userinfo = { loginname, loginpwd}; SetUserCredentials(ssokey, userinfo, userloginname); } }
/// <summary> /// 设置指定用户的登陆凭据 /// </summary> /// <param name="appId">业务系统标识</param> /// <param name="userInfo">凭据信息</param> /// <param name="userLoginName">MOSS登陆帐号: domainName\LoginName</param> public static void SetUserCredentials(string appId, string[] userInfo, string userLoginName) { try { SPSecurity.RunWithElevatedPrivileges(delegate() { List<SecureStoreCredential> creds = new List<SecureStoreCredential>(); SecureStoreCredential name = new SecureStoreCredential(toSecureString(userInfo[0]), SecureStoreCredentialType.UserName); SecureStoreCredential pwd = new SecureStoreCredential(toSecureString(userInfo[1]), SecureStoreCredentialType.Password); creds.Add(name); creds.Add(pwd); SecureStoreCredentialCollection credes = new SecureStoreCredentialCollection(creds.ToArray()); SecureStoreServiceProxy proxySs = new SecureStoreServiceProxy(); SPContext.Current.Site.AllowUnsafeUpdates = true; SPContext.Current.Web.AllowUnsafeUpdates = true; SPServiceContext context = SPServiceContext.GetContext(SPContext.Current.Site); ISecureStore store = proxySs.GetSecureStore(context); SPClaim claim = SPClaimProviderManager.Local.ConvertIdentifierToClaim(userLoginName, SPIdentifierTypes.WindowsSamAccountName); store.SetUserCredentials(appId, new SecureStoreServiceClaim(claim), credes); }); } catch { } }
复制代码

这个方法就会把你当前登录人对应OA的账户密码储存在moss的OA里面

OK,现在账户也存储了,列表也有了。下一步就是登录了。

在新建一个页面SSOSignOn.aspx

我们不是把列表里面的数据读出来了吗?下一步点这个OA连接跳转到SSOSignOn.aspx页面。

需要传几个参数,登录请求页面,账户的name值。密码的name值。登录成功后跳转的页面。虽然我们登录后,OA系统会自动跳转到登录成功页面,

之所以这么做。是因为我们的单点登录不是都要登录OA首页的,比如我们要直接登录到OA的其他功能模块

这个时候我们就不能登录成功后,还到OA首页了吧。

言归正传,我们SSOSignOn.aspx页面要处理些什么呢?

模拟OA的登录页面登录

SSOSignOn页面代码

<html>
<head id="Head1" runat="server"><title></title><script src="/_layouts/Infinite/js/jquery-1.6.1.min.js" type="text/javascript"></script><script type="text/javascript">//window.onload = function onsubmita() {var ishavesso = "<%=this.IsHaveSSO %>";var xmlhttp;if (ishavesso == "true") {var applicationType = "<%=this.AppType%>";var loginname = $("#UserName").val();var loginpwd = $("#PassWord").val();xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');//登录应用xmlhttp.Open('POST', '<%=this.GotoUrl %> ', false);xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xmlhttp.Send("<%=this.ParmLoginName %>=" + loginname + "&<%=this.ParmPassword %>=" + loginpwd);document.location = "<%=this.DetailUrl %>";}}</script></head>
<body><form action="<%=this.GotoUrl %>" method="post" autocomplete="off"><div id="logindiv" style="text-align: center; vertical-align: middle; height: 700px;margin-top: 180px; display: none;"><input type="hidden" name="" id="UserName" runat="server" /><input type="hidden" name="" id="PassWord" runat="server" /><br /></div><asp:Label ID="LabMsg" runat="server"></asp:Label><input type="hidden" name="return" id="returnPage" runat="server" value="" /><input name="" id="FormActionValue" runat="server" type="hidden" /></form>
</body>
</html>

cs文件代码

private string appname = string.Empty;public string AppName//SSOKey{get{if (this.appname == string.Empty && !string.IsNullOrEmpty(this.Request.QueryString["appname"]))this.appname = this.Request.QueryString["appname"];return this.appname;}}private string gotourl = string.Empty;public string GotoUrl//登录请求地址{get{if (this.gotourl == string.Empty && !string.IsNullOrEmpty(this.Request.QueryString["gotourl"]))this.gotourl = HttpUtility.UrlDecode(this.Request.QueryString["gotourl"]);return this.gotourl;}}private string detailurl = string.Empty;public string DetailUrl//登录成功后跳转的地址{get{if (this.detailurl == string.Empty && !string.IsNullOrEmpty(this.Request.QueryString["detailurl"]))this.detailurl = HttpUtility.UrlDecode(this.Request.QueryString["detailurl"]);return this.detailurl;}}private string parmLoginName = string.Empty;public string ParmLoginName//帐号name参数{get{if (this.parmLoginName == string.Empty && !string.IsNullOrEmpty(this.Request.QueryString["pname"]))this.parmLoginName = this.Request.QueryString["pname"];return this.parmLoginName;}}private string parmPassword = string.Empty;public string ParmPassword//密码name参数{get{if (this.parmPassword == string.Empty && !string.IsNullOrEmpty(this.Request.QueryString["ppwd"]))this.parmPassword = this.Request.QueryString["ppwd"];return this.parmPassword;}}private string _isHaveSSO = string.Empty;//sso里面是否存在账户和密码public string IsHaveSSO {get {return this._isHaveSSO;}}/// <summary>  /// 获取单点登陆业务系统中当前用户的信息        /// </summary>         /// <param name="appId">业务系统标识</param>         /// <returns></returns>public static List<string> GetUserCredentialCollection(string appId){List<string> credentialList = new List<string>();SecureStoreProvider prov = new SecureStoreProvider();SPServiceContext context = SPServiceContext.GetContext(SPContext.Current.Site);prov.Context = context; //当前上下文信息,以便从上下文中找到当前登陆用户 try{SecureStoreCredentialCollection cc = prov.GetCredentials(appId);for (int i = 0; i < cc.Count; i++){ISecureStoreCredential c = cc[i];IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(c.Credential);string sDecrypString = System.Runtime.InteropServices.Marshal.PtrToStringUni(ptr);credentialList.Add(sDecrypString);}}catch{}return credentialList;}protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){List<string> userInfoList =null;try{userInfoList = GetUserCredentialCollection(this.AppName);}catch (Exception){this.LabMsg.Text += "用户凭据未设置,请在管理中心中设置!";}if (userInfoList.Count >= 2){this.UserName.Value = userInfoList[0];this.PassWord.Value = userInfoList[1];_isHaveSSO = "true";}else{_isHaveSSO = "false";}}}

转载于:https://www.cnblogs.com/mySaveblogs/p/4021590.html

相关文章:

Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

Java IO流学习总结三&#xff1a;缓冲流-BufferedInputStream、BufferedOutputStream 转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/54894451 本文出自【赵彦军的博客】 InputStream |__FilterInputStream|__BufferedInputStream 首先抛出一个…

7-flutter Navigator 和Route

Route 和 Navigator 用于页面之间的跳转 一 Navigator 的 push 和 pop 用于页面之间的跳转 创建MaterialApp时可以指定routes参数&#xff0c;该参数是一个映射路由名称和构造器的Map 跳转的时候 使用 push 跳回的时候使用 pop import package:flutter/cupertino.dart; im…

小规模网络数据公开数据_大规模的在线公开课程曾经是100%免费的。 但是他们没有那样做。...

小规模网络数据公开数据I took one of the first Massive Open Online Courses (MOOCs) in 2011. Back then, everything was 100% free: the videos, the assignments, and the certificates. But in 2017, you can’t find this sort of free learning experience anymore.我…

swift -charts框架雷达图

参考资料 import UIKit import Chartsclass ViewController: UIViewController {let activities ["力量", "敏捷", "生命", "智力", "魔法"]override func viewDidLoad() {super.viewDidLoad()// Do any additional setup…

vector容器总结.xml

1 清空所有元素m_itemVector.clear(); 2 遍历vector<ITEM_CHECK>::iterator iterm_itemVector.begin(); for(i0;iter!m_itemVector.end();iter,i) { if(iter->flag-1) { break; } iter->flag1; } vector<ITEM_CHECK>::iterator iterm_itemVector.b…

Syncthing源码解析 - 第三方库

1&#xff0c;AudriusButkevicius/cli 网址&#xff1a;https://github.com/AudriusButkevicius/cli 2&#xff0c;bkaradzic/go-lz4 网址&#xff1a;https://github.com/bkaradzic/go-lz4 3&#xff0c;calmh 备注&#xff1a;这位是Syncthing项目创立者和最主要的开发者&…

安全工程师2017年真题_以下是2017年全球软件工程师的平均薪水

安全工程师2017年真题And here are those same salaries adjusted to San Francisco’s cost of living:以下是根据旧金山的生活费用调整后的相同工资&#xff1a; As you can see, cost of living is an important consideration. Also, you don’t need to move to San Fran…

测试思想 什么是软件测试(摘录)

什么是软件测试(摘录) by:授客 QQ&#xff1a;1033553122 IEEE 标准的定义:使用人工或自动的手段来运行或测定某个系统的过程&#xff0c;其目的在于检验;它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。对软件测试还有一些不同的定义。 G.J.Myers给出的定义:“程…

8-flutter 异步和线程

线程和异步的UI 1 异步的使用 Dart 有一个单线程执行模型&#xff0c;支持Isolate&#xff08;一种在另外一种线程运行dart的方法&#xff09;,一个事件循环和异步编程。 可以使用async / await 来做网络请求不会挂起UI 使用http 导入 import ‘dart:io’; import ‘dart:c…

前端页面紫红色_谷歌正在开发一种神秘的新型移动操作系统,称为紫红色

前端页面紫红色Google seems to be building a replacement for Android called Fuchsia. Yesterday, they revealed what their new Armadillo user interface looks like (see photo above, courtesy of Ars Technica).谷歌似乎正在建立一个名为Fuchsia的 Android替代产品。 …

iOS UIButton 文字图片上下左右布局

例如文字在左 图片在右,iOS 9 之后一句话搞定 backBtn.semanticContentAttribute UISemanticContentAttributeForceRightToLeft;按钮标题居左实现 dateBtn.contentHorizontalAlignment UIControlContentHorizontalAlignmentLeft; dateBtn.contentEdgeInsets UIEdgeInsetsMak…

linux xampp eclipse xdebug 无法进入断点

一、xampp 版本 1.8.3-5 xampp安装后会自动集成xdebug,目录一般为 /opt/lampp/lib/php/extensions/***-debug-***目录 关于php 与php.ini路径 php程序路径为&#xff1a;/opt/lampp/bin/ php.ini配置文件路径为&#xff1a;/opt/lampp/etc/ 1、配置文件一般在/opt/lampp/etc/ph…

sliva数据库简介--转载

sliva rRNA数据库&#xff08;http://www.arb-silva.de/&#xff09;用来检查和比对RNA序列&#xff0c;既可以针对16S/18S,SSU&#xff0c;也可以针对23S/28S, LSU&#xff0c;包括了Bacteria, Archaea and Eukarya。同时也是ARB的官方指定数据库。 LSU: Large subunit (23S/2…

haproxy ssl_我们如何微调HAProxy以实现2,000,000个并发SSL连接

haproxy sslby Sachin Malhotra由Sachin Malhotra 我们如何微调HAProxy以实现2,000,000个并发SSL连接 (How we fine-tuned HAProxy to achieve 2,000,000 concurrent SSL connections) If you look at the above screenshot closely, you’ll find two important pieces of in…

OC文件操作(1)

1.文件的浅度遍历与深度遍历&#xff1a; //NSFileManager * fm [[NSFileManager alloc]init];//创建文件管理器 //第一步创建一个文件管理器 NSError * error nil; //显示路径下的内容,作用类似于ls -a指令 //返回值是把目录下的内容放到NSArray中 //浅度遍历 NSFileManager …

10-flutter 使用http包请求和网络指示器

使用http package 进行网络请求操作 1 安装步骤 Step1 在pubspec.yaml 文件中添加依赖 dependencies:http: ^0.12.01Step2 flutter packages getStep3 导入头文件 import ‘package:http/http.dart’ as http; 2 使用 var responseBody;http.Response response await http.…

使用nat方式解决虚拟机联网问题

本文全文参考&#xff1a;http://jingyan.baidu.com/album/4e5b3e1957979d91901e24f1.html?picindex1&#xff0c;谢谢 对于很多的linux初学者来说&#xff0c;最开始学习linux时通常是在虚拟机上进行的&#xff0c;然而对于新手来说虚拟机联网会对他们来说是比较困难的。…

老年痴呆 数字化_设计老年人愉快数字体验的5条原则

老年痴呆 数字化by Kaye Mao毛凯(Kaye Mao) 设计老年人愉快数字体验的5条原则 (5 Principles for Designing Delightful Digital Experiences for Seniors) When we got my grandfather his first smart phone, he was thrilled. He had heard all about the wonders of video…

hdu 3664 1~n排列(aii ) 为k个数

http://acm.hdu.edu.cn/showproblem.php?pid3664 求1~n的排列个数&#xff0c;使得逆序数&#xff08;ai>i ) 为给定的k. dp[i][j]表示前1~i的排列中&#xff0c;有j个数是逆序数的个数. #include <cstdio> #include <cstdlib> #include <cmath> #includ…

四边参数值的设定

border&#xff0c;margin&#xff0c;padding 拿border举例 border&#xff1a;上&#xff0c;右&#xff0c;下&#xff0c;左。 border&#xff1a;上下&#xff0c;左右。 border&#xff1a;上下左右。 border&#xff1a;上&#xff0c;左右&#xff0c;下。转载于:https…

11-flutter事件监听

事件监听 1 本身支持事件检测&#xff0c;就可以直接使用onpress body:Center(child: RaisedButton(child: Text("Click"),onPressed: (){print("我被Click了");}),),2 如果本身不支持事件的检测&#xff0c; 使用 GestureDetector 添加一个点击事件 hom…

react前端开发_是的,React正在接管前端开发。 问题是为什么。

react前端开发by Samer Buna通过Samer Buna 是的&#xff0c;React正在接管前端开发。 问题是为什么。 (Yes, React is taking over front-end development. The question is why.) Update: This article is now part of my book “React.js Beyond The Basics”.更新&#xf…

12-flutter Textfield的使用

获取用户的输入用 TextField 或者TextFormField 的实现&#xff0c;通过控制器来实现获取用户的输入。 1 TextField 的属性 const TextField({Key key,this.controller,this.focusNode,// 这个属性可以用来监听输入框是否获取this.decoration const InputDecoration(),Text…

MyEclipse10整合Axis2插件

1、下载axis2的eclipse插件 2、把下载好的两个插件包解压后放置myeclipse10安装目录下的dropins文件夹中 3、重启MyEclipse10后 File->New->Other 到此Axis2插件安装完毕。 转载于:https://www.cnblogs.com/dreammyle/p/4036224.html

STM32GPIO管脚设置

&#xff08;1&#xff09;GPIO_Mode_AIN 模拟输入 &#xff08;2&#xff09;GPIO_Mode_IN_FLOATING 浮空输入&#xff08;3&#xff09;GPIO_Mode_IPD 下拉输入 &#xff08;4&#xff09;GPIO_Mode_IPU 上拉输入 &#xff08;5&#xff09;GPIO_Mode_Out_OD 开漏输出&#x…

数据结构中等号表示什么_通过分析2016年最重要的252个中等故事我学到了什么...

数据结构中等号表示什么Medium may be struggling to find a sustainable business model, but they have years worth of funding left, and more readers than ever.中型企业可能很难找到一种可持续的商业模式&#xff0c;但他们还有数年的可用资金&#xff0c;而且读者比以往…

event事件

10.2.6 事件传播 当事件目标是Window对象或其他一些单独对象&#xff08;比如XMLHttpRequest&#xff09;时&#xff0c;浏览器会简单的通过调用对象上适当的处理程序响应事件。 在调用在目标元素上注册的事件处理函数后&#xff0c;大部分事件会“冒泡”到DOM树根。 发生在文档…

[原创]用命令行工具删除TFS2010服务器上的工作区信息

下面的示例显示有关所有计算机上的所有用户已在地址 http://myserver:8080/tfs/DefaultCollection 上的以下团队项目集合中创建的所有工作区的列表。 c:\projects>tf workspaces /owner:*/computer:* /collection:http://myserver:8080/tfs/DefaultCollection tf workspace …

13-flutter 加载图片

Image Widget 1 flutter 加载图片的方式 new Image从ImageProvider 中获取图像new Image.asset使用key 从assetBundle 获取图片Image.network从网络中获取图片Image.file从本地文件获取图片Image.memory用来加载Uint8List资源&#xff08;字节数组&#xff09;图片 2 image 支…

react 组件样式_如何使用样式化组件为React组件创建视觉变体

react 组件样式by Gilad Dayagi通过吉拉德达亚吉 如何使用样式化组件为React组件创建视觉变体 (How to create visual variants for React components using styled-components) Styled-components is a library for styling React components that took the React world by s…