本节书摘来自异步社区《微软云计算Windows Azure开发与部署权威指南》一书中的第6章,第6.1节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问云栖社区“异步社区”公众号查看。
6.3 Windows Azure的AppFabric存取控制应用程序设计
在过去的几十年里,企业中对于身份识别问题的解决方案一直在向基于声明靠拢。基于声明的身份模型将应用程序中的身份认证和授权的公共部分抽取出来,集中到外部服务中,这个服务由安全和身份识别方面的专家编写和维护,这样做是非常有益的。
图6-9所示为ACS的一般应用场景。
客户端请求①并由②获得一个SWT令牌,之后客户端使用该SWT来调用服务③,一旦被ACSAuthorizationManager成功验证,④便能访问到所需的服务方法。
从另一方面来看,确保用户可以连接到云端服务是任何解决方案中最基本的需求,无论是本地应用、云端应用还是二者都有。而用户账户存放在不同网站或商业实体造成的隔离成为身份验证的瓶颈,使用一些标准能够打破这种瓶颈,但是要对来自不同机构的用户开放云服务是件很麻烦的事情。比如,现在想将云服务向来自Facebook、Live ID、Google和企业名录里的用户开放,这要求实现四种不同的认证协议。如今的世界变化迅速而频繁,这就要求不断更新协议使用最新版本的认证机制,这将占用很大的资源,使得不能集中资源做好业务。Windows Azure访问控制服务可以提供认证的外包服务,不需要考虑如何与各种身份提供商直接建立联系,降低了工程的耦合度。访问控制服务负责与各个服务提供商交流,并将认证结果使用.NET平台工具(也就是Windows Identity Foundation技术)支持的一种协议规范化。使用WIF只需单击几下就可以将ACS作为的云端服务的认证管理器。除此之外,访问控制服务还可以更好地控制对于每一个认证事件该用户需要被赋予什么属性。图6-10所示为从功能角度来看访问控制服务。
接下来介绍利用微软Windows Azure平台的训练包开发一个能对来自多个身份提供商的不同用户进行身份验证的访问控制服务实例项目,使用的操作系统是Windows 7,使用的训练包是WATK June2012.exe,训练包下载网址:http://www.microsoft.com/en-us/download/details.aspx?id=8396。
在进行开发之前要确保已经安装了如下软件或组件。
- IIS 7.0。
- Microsoft .NET Framework 4.0。
- Microsoft Visual Studio 2010。
- AppFabric SDK。
- Microsoft Windows Identity Foundation Runtime。
- Microsoft Windows Identity Foundation SDK。
- Microsoft Windows PowerShell。
- Windows Azure平台的订阅账号。
训练包下载完后双击运行,安装后找到安装根目录下的LabsIntroAccessControlServiceSource目录,双击运行Setup.cmd,启动安装进程,它将进行环境检查和配置,安装Visual Studio代码段。如果出现了用户账户控制对话框,请确认以继续。
开发步骤如下。
1.步骤一:创建初始解决方案
① 管理员权限打开VS2010。
② 选择“open”命令,从SourceEx1-AcceptUsersFromMultipleIPsBegin文件夹下打开WebSiteACS.sln。
③ 创建一个空的网址,如图6-11所示。右键单击WebSiteACS解决方案,选择“add”→“New Web Site”,在左侧选择“Visual C#”模板,单击“ASP.NET Web Site”。将“Web location”旁边的下拉框选为“HTTP”,值设为“https://localhost/WebSiteACS”,单击“OK”按钮。
④ 进入Solution Explore,删除Account、Scripts两个文件夹和About.aspx、Global.aspx两个文件,如图6-12所示。
⑤ 打开Site.master文件,删除class名为“loginDisplay”的DIV和ID为“NavigationMenu”的Menu,删完后如图6-13所示。
⑥ 打开Web.config文件,删除以下部分。
connectionStrings
system.web/authentication
system.web/membership
system.web/profile
system.web/roleManager
删除后的Web.config如图6-14所示。
⑦ 按F5运行该网站,确保其运行正常。如果出现“Debugging Not Enabled”的警告框,选择“Modify the Web.config file to enable debugging”,单击“OK”按钮,如图6-15所示。运行正常后界面如图6-16所示。
目前该网站没有任何访问控制机制。
2.步骤二:注册Windows Azure访问控制服务并创建命名空间
① 进入网址https://manage.windowsazure.com。如果没有事先登录过,会出现登录界面,需要输入微软账户(Windows Live ID)。
② 由于本书编写时在新的门户网站上还没有访问控制的连接,需要进入以前的门户网站。将鼠标光标放在主页的“PREVIEW”上,单击“Take me to the previous portal”,如图6-17所示。
③ 单击左下角的“Service Bus,Access Control &Caching”按钮,得到如图6-18所示页面。
④ 添加一个新的访问控制命名空间,访问控制命名空间是唯一的,所有的访问控制服务的访问地址都包含该命名空间。选中左侧面板中的“Access Control”后,单击左上侧的“New”按钮,如图6-19所示。
https://yqfile.alicdn.com/9ae90423866a3c2f8f29fa4784ac47fae4041d03.png" >
⑤ 单击“New”后会弹出一个对话框。为Namespace输入名字,选择Country/Region,单击“Create Namespace”按钮,如图6-20所示。注意,命名空间必须是全球唯一的。
https://yqfile.alicdn.com/04f02577ff45654340ced96f73f69d1b9d12664c.png" >
⑥ 服务被激活的过程中读者要耐心等待,分配必须的资源会花费几分钟时间。激活后的服务状态为“Active”,如图6-21所示。
3.步骤三:配置允许的身份提供商和依赖方,签写证书
① 选中命名空间,在上方工具栏中单击“Access Control Service”按钮,如图6-22所示。要确保允许appservices.azure.com网站弹出窗口。
② 单击后进入访问控制服务管理门户,如图6-23所示。
③ 管理门户左侧的导航栏提供了可以对设置进行修改的全局视图。单击“Trust Relationship”下的“Identity Provider”连接,主区域会显示对身份提供商的管理页面,如图6-24所示。
④ 单击身份提供商表格上的“Add”链接,选择要在该访问控制服务命名空间中添加的身份提供商,如图6-25所示,单击“Next”按钮。Windows Live ID默认添加。
https://yqfile.alicdn.com/ecb02ca9abc0b983e33c18bf08aa8b8f4bfc9308.png" >
⑤使用默认设置,单击“Save”按钮,如图6-26所示。
⑥ 参考步骤④、⑤添加其他的身份提供商,本例添加完后如图6-27所示。
⑦ 单击导航栏中的“Relying Party Applications”链接以使用ACS注册网站。“Relying Party”是云服务的代言人,它与“Identity Provider”进行交互,进行用户的身份验证,如图6-28所示。
⑧ 单击“Relying Party Applications”表格上面的“Add”链接,添入如下值。添加完成后的结果如图6-29所示。
Name: WebSiteACS。
Mode: Enter settings manually。
Realm: https://localhost/WebSiteACS/。
Return URL: https://localhost/WebSiteACS/Default.aspx。
Error URL: leave the field empty。
Token format: SAML 1.1。
Token encryptionpolicy: None。
Token lifetime(secs): 600。
Identity Providers: Google, Windows Live ID, Yahoo!。
Rule groups: Create New Rule Group。
Token signing: Use service namespace certificate standard。
⑨ 单击“Save”按钮。
10 在导航栏的“Trust Relationships”部分,单击“Rule Groups”链接,选择默认的规则组,如图6-30所示。
11 单击“Default Rule Group for WebSiteACS”,然后单击“Generate”链接,如图6-31所示。将3个身份提供商全部选中,以能够基于可用的声明类型自动为其生成规则,单击“Generate”按钮,如图6-32所示。不同的身份提供商提供不同的声明,ACS能够识别并且生成相应的默认规则。最后单击“Save”按钮。
12 在导航栏的“Development”部分单击“Application Integration”链接。这里有各种URI,当配置云服务时可以派上用场。
13 进入“Endpoint Reference”部分,将“WS-Federation Metadata”的值复制下来,在下面的步骤中将派上用场,如图6-33所示。
4.步骤四:配置网址使接收来自访问控制服务的令牌
ACS能够接收和处理来自很多身份提供商通过不同协议、使用不同格式的令牌,并将传入的消息用另一种不同的令牌规范化,这个令牌的网站可以识别。ACS可以在不同的协议上发出不同的令牌。对于网站,默认的协议是WS-Federation。读者并不需要深入理解这个协议,只需要知道WIF(Windows Identity Foundation)支持该协议,所以可以将云服务的身份验证外包给令牌提供源,比如ACS本身。值得一提的是,WIF对Visual Studio进行了扩展,使其提供向导可以自动配置的云服务,将认证进行外包而不用编写代码。它只需要一个可以描述要使用的令牌提供源的地址,在本例中就是在步骤三最后复制的WS-Federation Metadata address。下面我们将通过WIF向导将认证外包给ACS。
进入Visual Studio的Solution Explorer,右键单击“https://localhost/WebSiteACS/”项目,选择“Add STS reference”。
② Federation Utility窗口出现后,按照向导完成以下步骤。
a.在“Welcome”界面保留预填充的值,单击“Next”按钮继续,如图6-34所示。
b.在“STS options”页中选择第三个单选按钮“Use an existing STS”选项,将步骤三最后复制的端点地址即“Endpoint Reference WS-Federation metadata”的值贴入,单击“Next”按钮,如图6-35所示。
c.在“STS signing certificate chain validation error”页中选择“Disable certificate chain validation”,如图6-36所示,单击“Next”按钮继续。
ion”
d.在“Security token encryption”页中选择“No encryption”,单击“Next”按钮,如图6-37所示。
https://yqfile.alicdn.com/8835d8fd77c20cfa5236fea781736454e2d23e4e.png" >
e.在“Offered claims”页中单击“Next”按钮,如图6-38所示。
https://yqfile.alicdn.com/e1705c3ac720c51c5c08117cc4e0fddf7669b534.png" >
f.在“Summary”页中重新审查做的改动,没有问题则单击“Finish”。
现在我们已经完成了该示例,下面进行验证。
① 按F5键启动调试。信任方(https://localhost/WebSiteACS/)会重定向到ACS进行认证。
② 选择身份提供商。将会被重定向到身份提供商的网站并要求输入相关证书。此处本例使用的是Windows Live ID,如图6-39所示。
③ 在Windows Live ID登录网站并输入Live ID和密码,如图6-40所示。
https://yqfile.alicdn.com/df3c07f98fef55e0d35c5d192ac10bf6781271ac.png" >
④ 身份验证成功后就会重新返回到ACS,ACS快速处理后重定向返回的网址。
⑤ 这整个过程对用户都是透明的,但是网站知道是来自ACS的合法令牌在请求访问。被授权访问后就会进入网站的默认页面,如图6-41所示。
https://yqfile.alicdn.com/050734b07f8e75142f64e6e0ed28571a6f627647.png" >
⑥ 验证结束,关闭浏览器。