Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service

本文是Windows Azure AppFabric入门教学的第五篇文章。本文会对AppFabric中的Access Control Service(ACS)做初步的讲解。为了使后续的学习顺利进行请确保已浏览本教程的第一篇文章,并以按照该文完成了AppFabric项目和命名空间的创建。我们知道,AppFabirc由Service Bus 和 Access Control Service组成,在前一篇教程中我们已介绍过Service Bus,所以本文将简略的介绍如何使用ACS服务来确保安全性。 同时,因为本文会使用到SWT和OAuth协议,读者可以浏览本教程第四篇文章,以快速了解该协议。

前置条件

为了使后续的教程能够顺利进行,请确保如下软件或组件已被安装:

·         Microsoft .NET Framework 3.5 SP1

·         Microsoft Visual Studio 2008 SP1 (or above)

·         AppFabric SDK

·        Windows Azure Platform Training Kit - December Update(示例代码)

请确保您已拥有一定的WCF编程经验,若没有,请浏览这里以快速的初步了解WCF。

最后请确保已创建了一个AppFabric项目和一个服务命名空间。请参考这里。

原理:

我们首先了解一下ACS的一般应用场景:

客户端请求 (1)并获得 (2)一个 SWT 令牌 。之后客户端使用该 SWT来调用服务(3),一旦被ACSAuthorizationManager成功验证, (4),便能访问到所需的服务方法。

代码:

在了解了通信原理之后,我们来看看具体代码是如何编写的。

1.  在Windows Azure Platform Training Kit - December Update (示例代码) 安装目录下,Labs\IntroAppFabricAccessControl\Source\Ex01-UsingACWithSymmetricKey\Begin目录下,打开SymmetricKey.sln工程。

该工程已能正常运行,我们会在其基础上修改代码来让其与ACS集成。首先我们调试,查看一下在没有ACS时的运行情况。

右击Service项目,Debug->Start new instance,启动一个Service实例。

以同样方式启动一个Client实例,最终结果如下。

打开Service项目的Program.cs,我们看到程序代码只是简单的将IWeatherForecast服务挂载到http://localhost/weatherforecast之上。

而Client项目也只是简单通过该URI来访问所需服务。如下图。

注意:我们从最终结果看到Get3DaysForecast与Get10DaysForecast方法都能被访问到。

2.  修改服务以接受和验证AppFabric AC 令牌。

必须确保代码调用被检验的请求内容时,检查SWT令牌。一旦验证存在SWT,您必须检查其是否用合法的密钥签名过。在本例中,我们提供了ServiceAuthorizationManager类来实现验证逻辑。

2.1右击Service项目,Add->Existing item,进入Source\Ex01-UsingACWithSymmetricKey\Assets,添加ACSAuthorizationManager.cs和TokenValidator.cs

2.2在Service项目Program.cs中加入如下粗体代码:

C#

public class Program

{

private const string ServiceNamespace = "{insert service namespace here}";

private const string TokenPolicyKey = "{insert token policy key

here}";

private const string Audience = "http://localhost/weatherforecast";

private const string RequiredClaimType = "action";

private const string IssuerName = "https://{0}.accesscontrol.windows.net/";

public static void Main(string[] args)

将ServiceNamespace改为您在本教程第一篇文章中创建的服务命名空间。

2.3在Main函数中加入如下粗体代码,以使ACS验证流程植入到程序调用服务的流程中。一旦我们定制的ServiceAuthorizationManager 类被插入到WCF 管道中(pipeline),它在每次服务调用时自动执行。

host.AddServiceEndpoint(typeof(IWeatherForecast), binding, new Uri("http://localhost/weatherforecast"));

host.Authorization.ServiceAuthorizationManager = new ACSAuthorizationManager(

string.Format(IssuerName, ServiceNamespace),

Audience,

Convert.FromBase64String(TokenPolicyKey),

RequiredClaimType);

host.Open()

3.配置客户端使用 AppFabric Access Control来访问服务

3.1在Client项目,Program.cs中,加入如下粗体代码:

namespace Client

{

using System;

using System.Collections.Specialized;

using System.Linq;

using System.Net;

using System.ServiceModel;

using System.ServiceModel.Security;

using System.ServiceModel.Web;

using System.Text;

using System.Web;

using System.IO;

public class Program

以及如下粗体代码:

public class Program

{

private const string ServiceNamespace = "{insert service namespace here}";

private const string IssuerName = "weatherforecastclient";

private const string IssuerKey = "{insert issuer key here}";

private const string AcsHostName = "accesscontrol.windows.net";

public static void Main(string[] args)

{

3.2在Program类中加入如下方法:

...

private static string GetACSToken()

{

// request a token from AppFabric AC

WebClient client = new WebClient();

client.BaseAddress = string.Format("https://{0}.{1}", ServiceNamespace, AcsHostName);

NameValueCollection values = new NameValueCollection();

values.Add("wrap_name", IssuerName);

values.Add("wrap_password", IssuerKey);

values.Add("wrap_scope", "http://localhost/weatherforecast");

byte[] responseBytes = client.UploadValues("WRAPv0.9", "POST", values);

string response = Encoding.UTF8.GetString(responseBytes);

return response

.Split('&')

.Single(value => value.StartsWith("wrap_access_token=", StringComparison.OrdinalIgnoreCase))

.Split('=')[1];

}

}

}

3.3在Main函数开头加入如下代码:

string acsToken;

try

{

acsToken = GetACSToken();

}

catch (WebException ex)

{

Console.ForegroundColor = ConsoleColor.Red;

if (ex.Response != null)

{

Stream exception = ex.Response.GetResponseStream();

StreamReader reader = new StreamReader(exception);

Console.WriteLine(reader.ReadToEnd());

}

else

{

Console.WriteLine(ex.Message);

}

Console.ReadLine();

return;

}

同样在Main函数中对应位置加入如下代码 :

using (new OperationContextScope(proxy as IContextChannel))

{

string authHeaderValue = string.Format("WRAP access_token=\"{0}\"", HttpUtility.UrlDecode(acsToken));

WebOperationContext.Current.OutgoingRequest.Headers.Add("authorization", authHeaderValue);

// call the service and get a response

4.配置AppFabric ACS命名空间以为特定调用者实现访问逻辑。

4.1点击“开始”->“运行”,输入cmd,回车。将当前工作路径切换到WindowsAzurePlatformKit\Labs\IntroAppFabricAccessControl\Source\Assets

4.2创建TokenPolicy,输入如下代码并执行:(注意:以下所有黄色框内内容皆需替换为读者自己的信息,service指service namespace,mgmtkey指management key)

acm create tokenpolicy -name:weatherforecast -timeout:28800 -autogeneratekey -service:{your service namespace} -host:accesscontrol.windows.net -mgmtkey:{your management key}

返回TikenPolicy ID  =  tp_18d47a547b0f40648fdabfe753885dd4

4.3创建Scope,输入如下代码并执行:(tokenpolicyid为上步返回的TikenPolicy ID)

acm create scope -name:weatherforecast -tokenpolicyid:tp_18d47a547b0f40648fdabfe753885dd4 -appliesto:http://localhost/weatherforecast -service:{your service namespace} -host:accesscontrol.windows.net -mgmtkey:{your management key}

返回Scope ID =  scp_3c9c465f2be54bed809080f210914f70dab58dee

4.4 创建Issuer,输入如下代码并执行:

acm create issuer -name:weatherforecastclient -issuername:weatherforecastclient -autogeneratekey -algorithm:Symmetric256BitKey -service:{your service namespace} -host:accesscontrol.windows.net -mgmtkey:{your management key}

返回Issuer ID = iss_8c389a6764e8a26bf5133a7ab9c830f8bea33a82

4.5 创建Rule,输入如下代码并执行:(scopeid为步骤4.3返回的Scope ID,inclaimissuerid为上步返回的Issuer ID)

acm create rule -name:client3days  -scopeid:scp_3c9c465f2be54bed809080f210914f70dab58dee -inclaimissuerid:iss_8c389a6764e8a26bf5133a7ab9c830f8bea33a82 -inclaimtype:Issuer -inclaimvalue:weatherforecastclient -outclaimtype:action -outclaimvalue:Get3DaysForecast -service:{your service namespace} -host:accesscontrol.windows.net -mgmtkey:{your management key}

(这里我们看到打开了对于Get3DaysForecast服务的访问)

返会Rule ID = rul_462d5abd1326c40993f9ec2e766c0ab3b69c11093404db2736d81f5e6018caf141d2e4cdd2164335

4.6 输入如下代码,并执行,以获得TokenPolicyKey

时间: 2024-10-25 19:13:14

Windows Azure AppFabric 入门教学系列 (五):初探Access Control Service的相关文章

Windows Azure AppFabric 入门教学系列 (三):LABS环境

本文是Windows Azure AppFabric入门教学的第三篇文章.我们会介绍一下LABS环境. 微软AppFabric团队与2010年3月11日推出了AppFabric LABS环境.AppFabric团队会用其展示一些早期特性,并从社区获得反馈.用户无需为该环境的使用付费. AppFabric LABS 使得用户能够测试并使用实验性的AppFabric技术.对于那些激动人心的功能和特性,我们希望从用户那里尽快的获得反馈.LABS环境并没有SLA协议的支持,但您可以获得AppFabric

Windows Azure AppFabric 入门教学系列 (四):SWT 和OAuth WRAP介绍

本文是Windows Azure AppFabric入门教学的第四篇文章.我们知道AppFabric中的Access Control Service在验证授权过程中会使用到SWT 和OAuth WRAP,所以为了更好的了解ACS其内部原理,我们会在本教程中简单地介绍SWT 和OAuth WRAP协议. Simple Web Token (SWT) SWT简介: Simple Web Token (SWT)定义了传输简单声明的格式,其兼容性和格式能够轻易的被放入例如HTTP等协议的头部.一个简单的

Windows Azure AppFabric 入门教学系列 (二):一个简单的Service Bus例子

本文是Windows Azure AppFabric入门教学的第二篇文章,可以说是正式的开始学习AppFabric了.为了使后续的学习顺利进行请确保已浏览本教程的第一篇文章,并以按照该文完成了AppFabric项目和命名空间的创建.我们知道,AppFabirc由Service Bus 和 Access Control Service组成.本篇教学以一个简单的Echo程序来向大家简单的介绍一下Service Bus,让大家能有一个初步了解. 该程序演示了Client向Service发送消息,ser

Windows Azure AppFabric 入门教学系列 (六):Message Buffer之初体验

本文是Windows Azure AppFabric入门教学的第六篇文章.本文会介绍一下Service Bus中一个非常有用的特性-MessageBuffer.该特性类似于Queue Storage,作为一种小型的,临时的信息缓冲区,能够应用于多种场景.本例中,我们会简单的模拟一下订单系统:下单,查看订单,处理订单. 前置条件 为了使后续的教程能够顺利进行,请确保如下软件或组件已被安装: ·       Microsoft .NET Framework 3.5 SP1 ·       Micro

Windows Azure入门教学系列 (五):使用Queue Storage

本文是Windows Azure入门教学的第五篇文章. 本文将会介绍如何使用Queue Storage.Queue Storage提供给我们一个云端的队列.我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信). 一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间.这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后

Windows Azure入门教学系列 (七):使用REST API访问Storage Service

本文是Windows Azure入门教学的第七篇文章. 本文将会介绍如何使用REST API来直接访问Storage Service. 在前三篇教学中,我们已经学习了使用Windows Azure SDK所提供的StorageClient来使用Blob Storage, Queue Storage以及Table Storage的基本方法.我们在前几篇教学中也提及最终StorageClient也是通过发送REST请求来与服务器端通信的. 在这篇教学中,我们会以Blob Storage为例,说明如何

Windows Azure入门教学系列 (一): 创建第一个WebRole程序

原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言).在开始学习之前,请确保你的机器上已经安装了: Windows Azure Tools for Microsoft Visual Studio 1.1 (February 2010) Windows Azure Software Development Kit (November 2009) 步骤

Windows Azure入门教学系列 (八):使用Windows Azure Drive

我们知道,由于云端的特殊性,通常情况下,对文件系统的读写建议使用Blob Storage来代替.这就产生了一个问题:对于一个已经写好的本地应用程序,其中使用了NTFS API对本地文件系统读写的代码是否需要进行完全重写以便迁移到Windows Azure平台上呢?答案是否定的.Windows Azure平台提供了Drive的功能. 在1.1版本的SDK中提供了CloudDrive类,能够将本地NTFS文件系统Mount到Blob Storage上.我们只要添加一小段代码来表明我们希望Mount

Windows Azure SendGrid入门指南

今天的文章来自SendGrid的软件工程师Gabe Moothart.SendGrid 提供了一种基于云计算的电子http://www.aliyun.com/zixun/aggregation/12489.html">邮件服务,减轻企业的成本和维护自定义电子邮件系统的复杂性. 作为Windows Azure客户,您知道您可以轻松地访问一个高度可扩展的集成到任何 Windows Azure 环境上的应用程序的电子邮件提交解决方案? Windows Azure SendGrid 入门是很容易的