0

我通常是 ACS、WIF 和联合身份的新手,但我一直在研究 WIF SDK 培训工具包(以及 ACS 示例)中的示例,但我在与基于 ASP.NET MVC WebAPI 的 REST 服务(托管在 Azure 上),我将 ACS 设置为 FP。如果我使用浏览器测试我的 REST 服务 ( http://jordan-helloacs.cloudapp.net ),我将获得传统的“被动身份验证”体验,并且可以通过 Live ID 或 Google 登录(我将其设置为ACS 中的两个 IP)。

但是,我正在尝试使用一个简单的 WPF 应用程序来实现“被动-主动”体验,该应用程序通过使用

"https://[myACSnamespace].accesscontrol.windows.net/v2/metadata/IdentityProviders.js?protocol=javascriptnotify&realm=http://jordan-helloacs.cloudapp.net/&version=1.0",

ACS 上的端点列出可用的 IP,然后托管一个 WebBrowser 控件来处理对该 IP 的登录,并提取从 ACS 返回的 ACS 令牌,然后(使用 RestSharp)在http 上对我的端点进行 GET 调用: //jordan-helloacs.cloudapp.net。我已经成功提取了令牌(我已经尝试过 SWT 和 SAML2),但是一旦我从 WebBrowser 控件中获得了令牌,我就无法弄清楚我需要对它做什么。我见过几个不同的例子,其中令牌前面带有“OAUTH”或“WRAP access_token =”,并且只是传入了“Authorization”标头,但我所做的一切似乎都没有奏效。我的 RestSharp 客户端不断收到 302 到 ACS 登录页面。

关于我可能做错了什么的任何提示?我怎么知道如何指定 auth 标头格式?

4

1 回答 1

0

我正在写有关如何在 HTTP 标头或通过查询字符串或以下形式传递 SWT 令牌的更多信息:

如果您在 HTTP 标头中传递令牌,则应使用“授权”标头,此标头的值包含以下文本:WRAP access_token="tokenstring",并且不需要进行 URL 编码。

string headerValue = string.Format("WRAP access_token=\"{0}\"", HttpUtility.UrlDecode(token)); 
var client = new WebClient();            
client.Headers.Add("Authorization", headerValue);

如果您在“查询字符串”或“表单”内容中传递令牌,那么您应该使用名称/值对 as wrap_access_token=tokenstring 并且必须进行 URL 编码以构造 HTTP 请求:

var values = new NameValueCollection();
values.Add("wrap_access_token", token);
var client = new WebClient();
client.UploadValues("BartenderWebservice", "POST", values));

您可以使用上述任何一种方法,然后您可以将流传递给您的客户端,如下所示,一旦发送,请使用 Fiddler 或其他实用程序验证标头的正确性。

Stream stream = client.OpenRead(@"http://yourwcfservice.cloudapp.net/RESTfulWCFServiceEndPoint.svc/_users_");
StreamReader reader = new StreamReader(stream);
String response = reader.ReadToEnd();

正如您提到的,您在连接到 RestFulWCF 端点时收到 302 错误(转发到 ACS URL)。仅当您启用了 IIS 日志记录时,您实际上可以 RDP 到您的 Azure VM 并查看应用程序事件日志以获取有关此错误的更多详细信息。我在事件日志中看到了这个错误,并提供了有关它发生原因的更多信息。可能是您的 web.config 中的某些设置导致了此问题。

稍后添加

在 ASPNet MVC 场景中,在获取令牌结束时,会创建一个 cookie,然后将 cookie 传递给 ASP Net 应用程序以指示身份验证。在顶层,您需要模拟类似的东西才能使其工作。

注意:这绝不是确切的答案,但是我不得不使用这个空间“作为答案”来编写格式化的评论以更好地表达。

于 2012-05-21T19:41:20.973 回答