我正在使用ACS在Windows 8应用程序中进行身份验证。我正在观察我的期望,因为UI显示了身份验证对话框,并且在成功输入我的LiveID凭据后,我返回到我的代码,但状态为我没有收到安全令牌,我只是在result.ResponseData中获取“https://XXXXX.accesscontrol.windows.net/v2/wsfederation?wa=wsignin1.0”
代码如下:
string loginUriString = "https://XXXXX.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%2f%YYYYY.cloudapp.net";
string redirectUriSting = "https://XXXXX.accesscontrol.windows.net:443/v2/wsfederation";
string authToken;
bool IsAuthenticated = false;
private async Task AuthenticateAsync()
{
var requestUri = new Uri(loginUriString, UriKind.RelativeOrAbsolute);
var redirectUri = new Uri(redirectUriSting, UriKind.RelativeOrAbsolute);
//var testUri = WebAuthenticationBroker.GetCurrentApplicationCallbackUri();
var result = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
requestUri,
redirectUri);
if (result.ResponseStatus != WebAuthenticationStatus.Success)
throw new Exception(string.Format("Login failed : {0}", result.ResponseErrorDetail));
//authToken = ExtractTokenFromResponse(result.ResponseData);
//if (!string.IsNullOrEmpty(authToken))
//{
_client.DefaultRequestHeaders.Authorization =
new System.Net.Http.Headers.AuthenticationHeaderValue("OAuth", result.ResponseData);
IsAuthenticated = true;
//}
}
我在这里看到了另一个问题似乎是一个类似的问题,但没有别的。我有什么不对吗?
答案 0 :(得分:2)
WebAuthenticationBroker
只是继续浏览,直到下一个请求的页面是callbackUri
参数指定的页面。此时它会返回给您的最终URL,因此如果您想要获得任何内容,则需要在该URL中进行编码。
在依赖方的ACS控制面板中,您需要指定网站上某个位置的返回网址。例如https://YYYYY.cloudapp.net/federationcallback
。然后创建一个控制器来处理接受该URL的帖子。该帖子将有一个表单字段wresult
,它是一些包含从ACS返回的令牌的xml。
然后,您可以通过重定向到WebAuthenticationBroker
https://YYYYY.cloudapp.net/federationcallback/end?token={whatever you want to return}
然后,您需要将身份验证代理的使用情况更改为以下内容:
var webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
new Uri("https://XXXXX.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2fYYYYY.cloudapp.net%2f"),
new Uri("https://YYYYY.cloudapp.net/federationcallback/end")
);
// The data you returned
var token = authenticateResult.ResponseData.Substring(authenticateResult.ResponseData.IndexOf("token=", StringComparison.Ordinal) + 6);