65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET MVC 和 WIF 创建 Twitter STS

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 5 月 7 日

CPOL

5分钟阅读

viewsIcon

31140

downloadIcon

245

本教程分步介绍如何创建自定义安全令牌服务 (STS)。

引言

Twitter STS

从 .NET 4.5 开始,我们拥有一个完全集成的环境来管理 .NET Framework 中的安全。通过使用 Windows Identity Foundation (WIF),我们不仅能够使用 Windows Azure Access Control Service (ACS) 和 Active Directory Federation Services 等身份提供程序,还能创建自己的安全令牌服务 (STS)。

目前 Windows Azure ACS 仍然不支持自定义身份提供程序(OpenID、WS-Federation 和内置 Facebook OAuth 应用除外),因此当您计划扩展您的 单点登录 (SSO) 端点来支持自定义 OAuth 提供程序时,您应该选择创建 OAuth 到 OpenID 或 OAuth 到 WS-Federation 的令牌转换服务。

由于我们想将 Twitter 添加为自定义 ACS 身份提供程序并在我们的应用程序中使用 Twitter 令牌,因此我们选择可扩展的 WS-Federation STS。

Twitter 授权

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

Authorization Sequence Diagram

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

  • Name - Twitter 平台上的用户名。
  • Name Identifier - Twitter 平台上的用户标识符。
  • Twitter Token - Twitter 令牌。
  • Twitter Token Secret - Twitter 令牌密钥。

Twitter STS 实现

由于我们的目标框架是 .NET 4.5,因此我们开箱即用地获得了 WIF。在之前的 .NET 框架版本中,我们应该使用自定义的 WIF nuget 包。请注意,.NET 4.5 中的 WIF 类位于 不同的命名空间中。最新的源代码可以 从项目页面获取

ASP.NET MVC STS

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

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

我们自定义 STS 的 WS-Federation 元数据端点会生成包含 服务定义信息 的响应,其中包含以下载荷:发布方服务名称、声明列表和授权端点。元数据应该是 数字签名的 XML

通常,SSO 在授权阶段会附加查询参数,这些参数指示授权请求的上下文。由于在向 Twitter 发送授权请求之前,我们需要获取一个请求令牌,并利用它来生成动态回调 URL,因此我们可以轻松地将 SSO 上下文信息传递到 Twitter 回调 URL 中。

从 Twitter 收到身份验证响应后,我们应该生成一个带有服务元数据中声明的 WS-Federation 令牌,并将该令牌返回给 SSO。由于 URL 长度限制,我们无法直接重定向到 WS-Federation SSO。在响应阶段,我们应该将序列化后的令牌值作为 application/x-www-form-urlencoded HTTP 消息发送。幸运的是,WIF 提供了 生成此类表单的 HTML 代码 的内置支持。

SignInResponseMessage responseMessage = FederatedPassiveSecurityTokenServiceOperations
    .ProcessSignInRequest(requestMessage, principal, this);
var htmlResponseForm = responseMessage.WriteFormPost();

Twitter 通信

为了访问 Twitter REST API,我们不会重新发明轮子,而是使用 TweetSharp nuget 包。它允许我们使用 Twitter 应用程序的 consumer key 和 secret 来初始化 Twitter 授权,并处理 Twitter 的响应。

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,然后点击“Create a new application”。填写表单,并在回调 URL 字段中设置基础 STS URL,例如在示例应用程序中是http://127.0.0.1:12525

Twitter Application

创建 Twitter 应用后,点击Settings选项卡,勾选“Allow this application to be used to Sign in with Twitter”选项,然后点击“Update this Twitter application's settings”按钮保存更改。

Enable Sign in with Twitter

创建 Azure ACS

现在我们应该创建一个将使用我们 WS-Federation STS 的 SSO 服务。因此,请转到 Azure 管理门户,选择 New -> App Services -> Access Control -> Quick Create,然后填写简单的表单。

New Windows Azure ACS

配置 ASP.NET MVC STS 应用程序

当我们有了 Twitter 应用和 Azure ACS 后,我们应该设置我们的 ASP.NET 应用的配置。为此,请打开 Web.config,在appSettings部分将“TwitterConsumerKey”“TwitterConsumerSecret”设置替换为 Twitter 应用Detailed选项卡中的 OAuth 设置。之后,在“TwitterWtRealm”“TwitterWReply”设置中,将{acs_namespace}值替换为您的 ACS 命名空间。

ASP.NET Web.config

将 Twitter STS 添加为新的 ACS 身份提供程序

既然我们已经完全配置了我们的 Twitter STS,我们就必须运行它。作为测试,我们可以请求服务元数据。例如,在我们的示例应用程序中,我们应该在浏览器中访问以下页面:http://127.0.0.1:12525/wsfederation/twittermetadata。如果您无法看到 Federation Metadata XML 内容,请检查端口 12525 是否未被其他应用程序占用,如果被占用,请在项目设置和 Twitter 应用的回调 URL 中进行更改。

将 Federation Metadata XML 文件(Ctrl+S)保存在您的计算机上 - 这将在下一步中需要。

WS-Federation Metadata

现在我们应该将我们的 STS 配置为新的 ACS WS-Federation 身份提供程序。为此,请导航到 Azure 管理门户,点击Active Directory服务组,选择Access Control Namespaces,选择您的 ACS,然后按Manage按钮。

在 Access Control Service 配置中,点击Identity providers,然后按Add。在下一页,选择WS-Federation identity provider选项,然后按Next。您会看到一个表单,在WS-Federation metadata部分选择文件,然后选择上一步中保存的 FederationMetadata XML 文件。如果您在 HTTP 端点上运行 STS 应用,请取消选中Require URLs in metadata to use HTTPS (recommended)选项。之后,配置Relying party applications,然后按Save按钮。

Azure ACS Twitter IP

就这样。如果您想创建一个新的示例声明感知应用程序,可以参考 ASP.NET MVCASP.NET Web Forms 应用程序的参考资料。

© . All rights reserved.