2

我正在使用 ACS 在 Windows 8 应用程序中进行身份验证。我正在观察我所期望的,因为 UI 显示了身份验证对话框,并且在成功输入我的 LiveID 凭据后,我以成功状态返回到我的代码,但我没有收到安全令牌,我只是得到“https://XXXXX .accesscontrol.windows.net/v2/wsfederation?wa=wsignin1.0" in result.ResponseData

代码如下:

  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;
        //}
    }

我在这里看到了另一个 SO 问题,似乎是一个类似的问题,但没有别的。我有什么问题吗?

4

1 回答 1

2

只是继续浏览,WebAuthenticationBroker直到下一个请求的页面是callbackUri参数指定的页面。那时它会返回最终的 URL 给你,所以如果你想取回任何东西,它需要在那个 URL 中编码。

在依赖方的 ACS 控制面板中,您需要指定站点上某处的返回 URL。例如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);
于 2012-09-27T03:07:31.953 回答