天天看点

MOSS群2008年1月3号技术讲座:kaneboy关于如何在SharePoint中集成Live ID认证

ShuGuang 说:

“如何在SharePoint中集成Live ID认证”

ShuGuang 说:

这个主题涉及到两个方面,1、SharePoint的membership provider机制,2、Live ID

ShuGuang 说:

先简单的讲一下live id

ShuGuang 说:

live id就是以前的.net passport

ShuGuang 说:

任何第三方网站可以使用live id来作为自己的认证体系,live id也提供了简单好用的接口

ShuGuang 说:

首先,需要在live上为自己的网站注册一下

ShuGuang 说:

https://msm.live.com/app

ShuGuang 说:

在这里,需要提供几项信息:application名称,通过live id认证后转向到哪个url

ShuGuang 说:

注册完成后,需要知道两个信息:application id和secret key(自己指定),application id是一串字符,比如,wiki.msotec.net注册后的application id就是“00163FFF80006065”

ShuGuang 说:

然后,在自己的网站上显示一个指向live的登录链接,在链接url后面要加上application id的query string

ShuGuang 说:

我这里讲的是原理,具体步骤和方法可以参考live id sdk

ShuGuang 说:

用户点击登录后,会被导到live id的登录page,在这个page上使用自己的live id进行登录

ShuGuang 说:

然后,live会向我们指定的一个url进行一个post的动作,post的数据中包含了多项信息,但最主要,就是这个live id帐号的一个唯一id号

ShuGuang 说:

每个live帐号在每个application都有一个唯一的用户id

ShuGuang 说:

live登录后,只会将这个唯一的id告诉我们的网站

ShuGuang 说:

也就是说,用户在live登录后,我们的网站实际上不能知道这个用户的任何信息,包括他的live帐号、邮件地址...只有一个id号(一串字符)

ShuGuang 说:

这样的设计,也是为了保护用户的隐私

ShuGuang 说:

我们的网站拿到这个用户id号之后,再根据自己的需求,进行处理。

ShuGuang 说:

live id就是这么回事了

骆建峰 说:

Live ID 這個服務是要收費的嗎?

西安㊣UnName 说:

有配额限制吗

大连㊣银烨妖瞳 说:

应该不会吧

ShuGuang 说:

千万要注意的是,得到的这个用户id,只是一串字符,既不是用户的邮件(Live帐号),也不是他的名字。我们不能从这个用户id推导出任何用户的个人信息

ShuGuang 说:

free

ShuGuang 说:

no limit

ShuGuang 说:

OK,介绍完live id,我再讲sharepoint这边。最后会再具体介绍wiki.msotec.net上是如何把live id和sharepoint的用户系统进行整合的

ShuGuang 说:

一个要注意的是:“认证”和“授权”是两回事,不要混为一谈!

ShuGuang 说:

认证:就是确认一个访问者是不是某人,通常需要这个访问者提供用户名、密码,或者其他方式(比如使用live id)

ShuGuang 说:

认证只能确认这件事:那个号称自己是十一的访问者,确实是十一本人

ShuGuang 说:

AD就是用于认证的

ShuGuang 说:

授权:确认某个用户在我们的系统里面有什么样的权限,能做什么,不能做什么

ShuGuang 说:

sharepoint的授权系统是自己管理的,我们通常通过“网站设置”进入到的权限管理里面,都是“授权”这一块的内容

ShuGuang 说:

而认证这一块,sharepoint使用了membership provider,这个asp.net 2.0的模块,以提供强大的扩展性

ShuGuang 说:

也就是,从某种意义上来说,sharepoint本身并不管认证,而直管授权。sharepoint默认使用了ActiveDirectoryMembershipProvider,这个.Net 2.0内置的membership模块,来进行认证。也就是,默认使用AD集成认证

ShuGuang 说:

这个认证模块会验证页面访问者是什么人,然后把这个人的用户名告诉sharepoint,sharepoint然后进行授权检验,也就是看这个用户名在当前网站上是否有什么权限

ShuGuang 说:

.net 2.0内置了两个,这是其一,另外一个好像是使用SQL的那个

ShuGuang 说:

我继续。membership provider是可以由开发人员自己开发的

ShuGuang 说:

简单来说,我们自己写的membership provider要做这样的事情:验证一个访问者是否是某个用户

ShuGuang 说:

同时,membership provider还将用户的用户名这个信息返回给sharepoint

ShuGuang 说:

更严格的说,membership provider将用户名以这样的格式返回给sharepoint:“provider名:用户名”

ShuGuang 说:

这样,sharepoint就知道当前访问者是谁了

ShuGuang 说:

但是,这个访问者如果被sharepoint认为对当前网站没有访问权限,那也访问不了网站页面

ShuGuang 说:

在sharepoint管理中心,可以直接指定一个web application的membership provider是什么

ShuGuang 说:

当然,还需要将定制的membership provider在web.config里面注册。注册的方法和asp.net 2.0一模一样

ShuGuang 说:

OK,最后,来介绍一下wiki.msotec.net是怎么做的。源码大家可以下载到,可以对照看看

ShuGuang 说:

首先,我使用一个list,来保存有权限访问站点的用户的列表,这个list里面,最主要就是要保存从live id返回的那个用户id

ShuGuang 说:

然后,有一个定制的membership provider,LiveIDMembershipProvider类,wiki.msotec.net的认证由它负责

ShuGuang 说:

同时,源码里面还有一个web app项目,里面有几个页面,login.aspx之类,用来显示一个定制的页面给未登录用户,当然还有其他的事情

ShuGuang 说:

OK,现在是流程:首先,当用户点击站点的“登录”链接的时候,自动跳转到我写的login.aspx页面。这个行为是靠修改web.config里面的“<forms>”节点来实现的

ShuGuang 说:

比如:“<forms loginUrl='/_layouts/LiveIDPages/login.aspx' />”

上海㊣NEO 说:

这个更改对所有的站点都有效吗?

ShuGuang 说:

这个页面其实特别简单,就显示一个链接,指向live的真正登录页面,用户使用这个链接,跳转到live的登录页面

ShuGuang 说:

web.config对一个web application(可能包含一个或多个site collection)生效

huGuang 说:

访问者就在live的登录页面上,进行登录,登录完成以后,live将这个用户的唯一id号post给我指定的一个页面,这个页面在wiki.msotec.net里面,是“/_layouts/LiveIDPages/LiveIDAuthHandler.aspx”

ShuGuang 说:

这个用户唯一id号的格式类似“3721dd8ay7sdklaufhwq”...

ShuGuang 说:

LiveIDAuthHandler.aspx的page_load里面,分析一下request.Forms里面的数据,就得到了这个用户的唯一id

ShuGuang 说:

然后,在LiveIDAuthHandler.aspx里面,我调用了LiveIDMembershipProvider.ValidateUser()方法,这个方法里面的代码访问那个存放了站点用户数据的list,根据这个用户唯一id,看看是不是存在这样一个list item

ShuGuang 说:

如果存在,那么就读取这个list item的数据,这个list包含了其他的field,用来保存用户的“昵称”,然后把这个用户的昵称信息返回给LiveIDAuthHandler.aspx

ShuGuang 说:

LiveIDAuthHandler.aspx从LiveIDMembershipProvider.ValidateUser()得到肯定的信息之后,就确认,OK,这个用户是谁谁谁,他是我这个网站的用户,于是,调用asp.net forms认证的相关方法,写一个user token cookie,有了这个cookie,系统就会知道当前用户是谁,以及他已经通过了认证

ShuGuang 说:

如果LiveIDMembershipProvider.ValidateUser()发现这个用户从live返回的唯一id在那个用户list里面找不到,那么就返回false,LiveIDAuthHandler.aspx就会弹一个alert,说,好吧,你通过了Live认证,但是你不是我这个网站的用户,请你注册一下,然后,转向到RegisterPendingMember.aspx页面

ShuGuang 说:

RegisterPendingMember.aspx显示一个textbox,让用户填写,用户填写了,就会向保存用户信息的list写一个新的list item进去,当然,内容审批状态是待定。用户在这个页面上需要填写两项信息,昵称,和邮件地址

 umboy 说:

本地都保存用户的什么信息?

ShuGuang 说:

那个list里面主要就记录这个用户的live唯一id、昵称、邮件地址

ShuGuang 说:

管理员可以在那个保存用户信息的list里面审批通过这个用户,这样,下次用户登录的时候,就能够通过认证了

ShuGuang 说:

LiveIDMembershipProvider提供给sharepoint的用户名实际上是用户自己填写的昵称,而不是那个live唯一id

ShuGuang 说:

所以,用户登录后,在右上角会显示,“欢迎 [用户自己填写的昵称]”,因为sharepoint认为这个昵称就是用户名

ShuGuang 说:

sharepoint里面的SPUser.Loginname就等于这个用户昵称了。

 umboy 说:

有重名的可能了吧?

ShuGuang 说:

那个list,必须保证live id是唯一的,用户昵称也是唯一的

ShuGuang 说:

因为这个用户昵称要提供给sharepoint做用户名的

ShuGuang 说:

在LiveIDMembershipProvider.CreateUser()里面,大家可以看看那个代码

ShuGuang 说:

sharepoint接收到这个用户名之后,实际上会自己再存储到content db里面,这个用户就成为sharepoint站点用户了

ShuGuang 说:

站点管理员还需要在sharepoint的站点管理里面,授权这个用户有相应的权限

ShuGuang 说:

当管理员sharepoint的那个用户输入控件里面输入用户名,然后点击右方的那个用户验证按钮,sharepoint还是会调用LiveIDMembershipProvider里面的方法,来进行用户名验证

ShuGuang 说:

sharepoint还是会调用LiveIDMembershipProvider里面的方法,来进行用户名验证,以确认确实有这个用户存在

ShuGuang 说:

这个方法,还有一个问题,MOSS中有User Profile这个东东,由于我们使用了定制的membership provider,所以这些用户信息不会被自动导入到User Profile里面

ShuGuang 说:

sharepoint可以搜索用户,但是前提就是,这个用户要在User Profile里面有信息。

ShuGuang 说:

解决方法是可以自己写一个程序(Timer Job最好),定时将那个存放用户的List里面的用户信息导入到User Profile中

ShuGuang 说:

介绍完了。大家提问吧

ShuGuang 说:

源码下载:http://wiki.msotec.net/Documents/LiveIDSecurities.zip

ShuGuang 说:

Live ID SDK:http://msdn2.microsoft.com/en-us/library/bb404787.aspx

问题:

 umboy 说:

我问第一个问题:MOSS与RMS集成时,必须用AD验证才能实现对OFFCIE文档权限细粒度的控制?那么我们是否可以用LIVE ID做验证来实现呢?

这样就可以在非域环境里实现文档权限控制了。

ShuGuang 说:

sharepoint里面内置的那个IRM Protector,应该不能处理使用Live ID验证的场景。虽然理论上,我们可以通过写一个定制的IRM Protector来实现

 umboy 说:

 写IRM Protector的过程看http://msdn2.microsoft.com/en-us/library/ms439253.aspx 

关于RMS技术探讨,QQ群:24893581

继续阅读