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





0/5 (0投票)
本教程分步介绍如何创建自定义安全令牌服务 (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 应用程序。在下面的图片中,我们可以看到组件交互。
这里的声明感知应用程序请求 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 应用后,点击Settings选项卡,勾选“Allow this application to be used to Sign in with Twitter”选项,然后点击“Update this Twitter application's settings”按钮保存更改。
创建 Azure ACS
现在我们应该创建一个将使用我们 WS-Federation STS 的 SSO 服务。因此,请转到 Azure 管理门户,选择 New -> App Services -> Access Control -> Quick Create,然后填写简单的表单。
配置 ASP.NET MVC STS 应用程序
当我们有了 Twitter 应用和 Azure ACS 后,我们应该设置我们的 ASP.NET 应用的配置。为此,请打开 Web.config,在appSettings部分将“TwitterConsumerKey”和“TwitterConsumerSecret”设置替换为 Twitter 应用Detailed选项卡中的 OAuth 设置。之后,在“TwitterWtRealm”和“TwitterWReply”设置中,将{acs_namespace}值替换为您的 ACS 命名空间。
将 Twitter STS 添加为新的 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 管理门户,点击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按钮。
就这样。如果您想创建一个新的示例声明感知应用程序,可以参考 ASP.NET MVC 或 ASP.NET Web Forms 应用程序的参考资料。