在.NET框架中,Windows Identity Foundation (WIF) 提供了一个集成环境来管理安全。通过使用WIF,不仅可以使用诸如Windows Azure Access Control Service (ACS)和Active Directory Federation Services这样的身份提供者,还可以创建自己的安全令牌服务(Security Token Services, STS)。目前,Windows Azure ACS还不支持自定义身份提供者,除了OpenID、WS-Federation和内置的FacebookOAuth应用程序之外,因此当计划扩展单点登录(SSO)端点与自定义OAuth提供者时,应该选择创建OAuth到OpenID或OAuth到WS-Federation令牌转换服务。
Twitter平台通过OAuth 1.0a协议提供授权,并有限地通过OAuth 2.0提供(仅限应用程序)。需要提供基于浏览器的用户身份验证,因此选择使用用户身份检索的OAuth 1.0a协议。在这种场景中,对于用户授权,应该使用Twitter应用程序。在下面的图片中,可以看到组件的交互:
这里,一个感知声明的应用程序从SSO请求身份提供者列表,然后导航到自定义STS的授权URL,该URL反过来将用户重定向到Twitter授权页面。在成功的授权过程后,Twitter将用户重定向到自定义STS,该STS将OAuth身份转换为带有一些声明的自定义WS-Federation令牌。在实现中,以下声明是可用的:
由于目标框架是.NET 4.5,可以直接使用WIF。在以前的.NET框架版本中,应该使用自定义的WIF NuGet包。请注意,.NET 4.5中的WIF类位于不同的命名空间中。最新的源代码可以从项目页面获得。
WS-Federation STS应该提供以下功能:
自定义STS的WS-Federation元数据端点生成响应,包含服务定义信息,其中包含以下有效载荷:发行者服务名称、声明列表和授权端点。元数据应该是一个数字签名的XML。
通常,在授权阶段,SSO会附加查询参数,指示授权请求上下文。由于在向Twitter发送授权请求之前,应该获得一个请求令牌,并且通过利用它,可以为Twitter生成动态回调,因此可以轻松地将SSO上下文信息传递到Twitter回调URL中。
在收到Twitter的认证响应后,应该生成一个带有服务元数据中声明的声明的WS-Federation令牌,并将该令牌返回给SSO。由于URL长度限制,无法使用简单的重定向到WS-Federation SSO。在响应阶段,应该将序列化的令牌值作为application/x-www-form-urlencoded HTTP消息发送。幸运的是,WIF提供了生成此类表单的HTML代码的内置支持。
C# SignInResponseMessage responseMessage = FederatedPassiveSecurityTokenServiceOperations
.ProcessSignInRequest(requestMessage, principal,
this);
var htmlResponseForm = responseMessage.WriteFormPost();
为了访问Twitter REST API,不会重新实现轮子,而是使用TweetSharp NuGet包。它允许使用Twitter应用程序的消费者密钥和密钥初始化Twitter授权,并处理Twitter响应。
C# var service =
new TwitterService(consumerKey, consumerSecret);
var callbackUri =
new UriBuilder(callback)
{
Query =
string
.Format(
"context={0}"
, context)
};
OAuthRequestToken requestToken = service.GetRequestToken(callbackUri.ToString());
var authorizationUri = service.GetAuthorizationUri(requestToken);
创建Twitter应用程序
在运行MVC应用程序之前,应该创建一个新的Twitter应用程序。导航到https://dev.twitter.com/apps并点击“创建新应用程序”。填写表格,并将回调URL字段设置为基本STS URL,例如,在示例应用程序中,它是http://127.0.0.1:12525:
创建Twitter应用程序后,点击“设置”选项卡,勾选“允许此应用程序用于Twitter登录”选项,并通过点击“更新此Twitter应用程序的设置”按钮保存更改。
现在应该创建一个SSO服务,它应该消费WS-Federation STS。因此,转到Azure管理门户,选择新建->应用服务->访问控制->快速创建并填写简单表格。
当有一个Twitter应用程序和Azure ACS时,应该设置ASP.NET应用程序的设置。为此,打开Web.config并替换appSettings部分中的“TwitterConsumerKey”和“TwitterConsumerSecret”设置,使用来自详细标签的Twitter应用程序的OAuth设置。之后,替换“TwitterWtRealm”和“TwitterWReply”设置中的{acs_namespace}值,使用ACS命名空间。
由于已经完全配置了Twitter STS,必须运行它。作为一个测试,可以请求服务元数据。例如,在示例应用程序中,应该在浏览器中访问下一页:http://127.0.0.1:12525/wsfederation/twittermetadata。如果无法看到Federation Metadata XML内容,请检查端口12525是否被其他应用程序使用,如果是,请在项目设置和Twitter应用程序的回调URL中更改它。
保存Federation Metadata XML文件(Ctrl+S)在计算机上 - 这将在下一步中需要。
目前,应该配置STS作为新的ACS WS-Federation身份提供者。为此,导航到Azure管理门户,点击活动目录服务组,选择访问控制命名空间,选择ACS并按下管理按钮。