2

ASP.Net Web API アプリケーションを実行する Azure Worker ロールがあります。これは ACS によって保護されます。ブラウザを使用して Web API を参照すると、ACS から Google または LiveId に対して認証するよう求められます。認証すると、データを見ることができます。

Win 8 Metro スタイル アプリから同じ API にアクセスしようとしています。WebAuthenticationBroker を使用しようとしています。

WebAuthenticationResult 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("http://yyyyy.cloudapp.net/")
                                                       );

アプリを起動すると、以前と同じように、Google または LiveId を使用して認証するように求められます。これは成功し、成功した結果が得られます。

次に、HttpClient を使用して API への呼び出しを作成します。

    HttpClient client = new HttpClient();
    Uri _baseUri = new Uri("http://yyyyy.cloudapp.net/api/");
    client.BaseAddress = _baseUri;

    var response = client.GetAsync("Values/").Result;
    var responseBodyAsText = response.Content.ReadAsStringAsync().Result;

    var ids = JsonConvert.DeserializeObject<IList<int>>(responseBodyAsText);

この種の作業は、URI に正しくナビゲートしているように見えますが、戻ってくるペイロードは、期待している JSON データではなく、ログインを要求する HTML です。

私はこれに賢明な時間よりも多くの時間を費やしており、アイデアが尽きてしまいました! 誰でも助けてもらえますか?

4

3 に答える 3

2

localhost でテストするときは、ACS がコンピュータにアクセスできることを確認する必要があります。

@caleb が書いたように、トークンをリッスンしてブローカーにリダイレクトする必要があります。実際の例とその設定方法を含む私の投稿を見ることができます。

WebAuthenticationBroker は Windows 8 Metro アプリ ポスト リリース候補版で動作しますか

于 2012-09-27T08:24:46.437 に答える
1

WebAuthenticationBroker、ブラウザがロードしようとしている URL が callbackUri パラメータで指定された URL になるまで、単にブラウジングを続けます。その後、クエリ パラメータを含む最終的な URL が返されます。実際に callbackUri へのリクエストを行うことはありません。

あなたが抱えている問題は、ACS が実装する WS-Federation プロトコルが、(ACS 構成ポータルで指定された) URL を返すためにトークンをポストバックすることです。これは、AuthenticateAsync メソッドで callbackUri パラメーターとして指定した URL とおそらく同じです。

あなたがする必要があるのは、その投稿を処理し、要求を callbackUri にリダイレクトすることですが、トークンを含むクエリ文字列を使用します。

WebApi と WIF を使用しており、callbackUri を として指定しhttp://localhost:3949/api/federationcallback/end、戻り URL を として指定していhttp://localhost:3949/api/federationcallbackます。これにより、コントローラーで投稿を処理し、URL のトークンを使用してリダイレクトできます。コントローラーはこんな感じ。

public class FederationcallbackController : ApiController
{
    public HttpResponseMessage Post()
    {
        var response = this.Request.CreateResponse(HttpStatusCode.Redirect);
        response.Headers.Add("Location", "/api/federationcallback/end?acsToken=" + ExtractBootstrapToken());

        return response;
    }

    protected virtual string ExtractBootstrapToken()
    {
        return HttpContext.Current.User.BootstrapToken();
    }
}

次に、次のようにトークンを取得できます。

var authenticateResult = await WebAuthenticationBroker.AuthenticateAsync(
            WebAuthenticationOptions.None,
            new Uri("https://xyz.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost:3949%2f"),
            new Uri("http://localhost:3949/api/federationcallback/end"));

var oauthToken = authenticateResult.ResponseData.Substring(authenticateResult.ResponseData.IndexOf("acsToken=", StringComparison.Ordinal) + 9);
于 2012-09-27T02:48:57.337 に答える
0

WebAuthenticationResultAPI を呼び出すときにトークンを再利用すべきではありませんか?

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("http://yyyyy.cloudapp.net/"));

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization
        = new AuthenticationHeaderValue("OAuth", webAuthenticationResult.ResponseData);
于 2012-08-01T12:07:52.043 に答える