.NET框架中的安全集成环境

.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授权

Twitter平台通过OAuth 1.0a协议提供授权,并有限地通过OAuth 2.0提供(仅限应用程序)。需要提供基于浏览器的用户身份验证,因此选择使用用户身份检索的OAuth 1.0a协议。在这种场景中,对于用户授权,应该使用Twitter应用程序。在下面的图片中,可以看到组件的交互:

这里,一个感知声明的应用程序从SSO请求身份提供者列表,然后导航到自定义STS的授权URL,该URL反过来将用户重定向到Twitter授权页面。在成功的授权过程后,Twitter将用户重定向到自定义STS,该STS将OAuth身份转换为带有一些声明的自定义WS-Federation令牌。在实现中,以下声明是可用的:

  • 名称 - Twitter平台上的用户名。
  • 名称标识符 - Twitter平台上的用户标识符。
  • Twitter令牌 - Twitter令牌。
  • Twitter令牌密钥 - Twitter令牌密钥。

TwitterSTS实现

由于目标框架是.NET 4.5,可以直接使用WIF。在以前的.NET框架版本中,应该使用自定义的WIF NuGet包。请注意,.NET 4.5中的WIF类位于不同的命名空间中。最新的源代码可以从项目页面获得。

WS-Federation STS应该提供以下功能:

  • WS-Federation元数据端点。
  • SSO授权端点。
  • Twitter回调请求处理程序。

自定义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通信

为了访问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 STS

创建Twitter应用程序

在运行MVC应用程序之前,应该创建一个新的Twitter应用程序。导航到https://dev.twitter.com/apps并点击“创建新应用程序”。填写表格,并将回调URL字段设置为基本STS URL,例如,在示例应用程序中,它是http://127.0.0.1:12525:

创建Twitter应用程序后,点击“设置”选项卡,勾选“允许此应用程序用于Twitter登录”选项,并通过点击“更新此Twitter应用程序的设置”按钮保存更改。

创建Azure ACS

现在应该创建一个SSO服务,它应该消费WS-Federation STS。因此,转到Azure管理门户,选择新建->应用服务->访问控制->快速创建并填写简单表格。

配置ASP.NETMVC STS应用程序

当有一个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并按下管理按钮。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485