使用LiveID进行身份验证的WebAuthenticationBroker返回成功状态但没有安全令牌

时间:2012-09-17 08:37:38

标签: c# microsoft-metro windows-runtime .net-4.5 acs

我正在使用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;
        //}
    }

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

1 个答案:

答案 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);