2

解決 策 私の実用的な解決策は、回答または更新 2 にあります。

1) ここで、localhost でのテストのために、localhost ポートでのインバウンド用に Windows ファイアウォールをセットアップしていることを確認してください。ルーターがある場合は、ルーターでのポート転送。

2) 次に、IIS Express に、リクエストがローカル ホスト以外から送信されても​​問題ないことを伝える必要があります。Documents\IISExpress\config を見つけて、applicationhost.config を編集します。リストでサイトを見つけて、バインディングから localhost を削除します。

        <site name="S-Innovations.TrafficTheory.Web2" id="1591449597">
            <application path="/" applicationPool="Clr4IntegratedAppPool">
                <virtualDirectory path="/" physicalPath="G:\Documents\Visual Studio 2012\Projects\S-Innovations.TrafficTheory\S-Innovations.TrafficTheory.Web2" />
            </application>
            <bindings>
                <binding protocol="http" bindingInformation="*:909090:localhost" />
            </bindings>
        </site>

2a) ISS は管理者として実行する必要があり、Visual Studio を管理者として実行すると、ISS も管理者として起動されます...

3) あなたの IP、www.myip.com を見つけて、ACS リターン URI を次のように変更します。http://90.90.90.90:909090/api/federation/

4) Webbroker を変更して、IP も使用するようにします。

        WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
new Uri("https://traffictheory.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a48451%2f"),
new Uri("http://99.99.99.99:909090/api/federation/end"));

このようにすべてがうまくいきました。hello world がトークンとしてメトロ アプリに渡されました。

問題

WCF サービスと Metro アプリをセットアップしました。WCF サービスは、Azure ACS を使用して認証するように設定されています。

WebService と ACS で動作するコンソール アプリケーションを作成しました。

            static void Main(string[] args)
        {
            try
            {

                // First start the web project, then the client
                WebClient client = new WebClient();
                var token = RetrieveACSToken();
                client.Headers.Add("Authorization", token);
                client.Headers.Add("Content-type", "text/xml");
                var url = new Uri("http://traffictheory.azurewebsites.net/UserService.svc/Users");
                //var url = new Uri("http://localhost:4000/UserService.svc/Users");//
                Stream stream = client.OpenRead(url);
                StreamReader reader = new StreamReader(stream);
                String response = reader.ReadToEnd();
                Console.Write(response);

            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
            }
              Console.ReadLine();
        }

        private static string RetrieveACSToken()
        {
            var acsHostName     = ConfigurationManager.AppSettings.Get("ACSHostName");
            var acsNamespace    = ConfigurationManager.AppSettings.Get("ACSNamespace");
            var username        = ConfigurationManager.AppSettings.Get("ServiceIdentityUserName");
            var password        = ConfigurationManager.AppSettings.Get("ServiceIdentityCredentialPassword");
            var scope = "http://traffictheory.azurewebsites.net/"; 
            //var scope = "http://localhost:4000/";// 
            // request a token from ACS
            WebClient client = new WebClient();
            client.BaseAddress = string.Format("https://{0}.{1}", acsNamespace, acsHostName);
            NameValueCollection values = new
            NameValueCollection();
            values.Add("wrap_name", username);
            values.Add("wrap_password", password);
            values.Add("wrap_scope", scope);
            byte[] responseBytes =
            client.UploadValues("WRAPv0.9", "POST", values);
            string response =
            Encoding.UTF8.GetString(responseBytes);
            string token = response
            .Split('&')
            .Single(value =>
            value.StartsWith("wrap_access_token=",
            StringComparison.OrdinalIgnoreCase))
            .Split('=')[1];
            var decodedToken = string.Format("WRAP access_token=\"{0}\"", HttpUtility.UrlDecode(token));
            return decodedToken;
        }

Metro アプリから使用しようとすると、2 つの問題に直面します。1 つ目は、サービスとは関係なく、WebAuthenticationBroker に関するものです。

1) 使用する場合

WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
                WebAuthenticationOptions.None,
                new Uri("https://s-innovations.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2ftraffictheory.azurewebsites.net%2f"),
                new Uri("https://s-innovations.accesscontrol.windows.net")
            );

LiveID、Facebookなどを使用してログインできます。ACS に ID が正しく含まれていないため、Google ではありません。しかし、私はいかなる種類のトークンもクレームも受け取りません。私は得るだけです:

https://s-innovations.accesscontrol.windows.net/v2/wsfederation?wa=wsignin1.0 https://s-innovations.accesscontrol.windows.net/v2/facebook?cx=cHI9d3NmZWRlcmF0aW9uJn...cmFmZmljdGhlb3J5LmF6dXJld2Vic2l0ZXMubmV0JTJmJmlwPUZhY2Vib29rLTM1NTk5MjQ2NzgxNzc5OQ2&code=AQDagvqoXQ .......

この映画の最後にあるような請求を取得するにはどうすればよいですか: http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-858T 彼のアプリは動作します!

2) 上記のコンソール アプリは認証され、API を呼び出すときにサービスに渡すトークンを取得します。metro アプリ内からこのトークンを取得するにはどうすればよいですか。

アップデート

提案どおりにコントローラーを作成しました:

[HttpPost]
public ActionResult End()
{
    return Json("Hello World");
}

ブレークポイントを入れて、それが得られるかどうかを確認しました。まだヒットなし。

    WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
new Uri("https://traffictheory.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a48451%2f"),
new Uri("http://localhost:909090/Federation/End"));

私の証明書利用者アプリケーションでは、私は持っています

Realm http://localhost:909090/
Return Url: Nothing  (have tried http://localhost:909090/Federation/End )

応答データには次が含まれます:http://localhost:909090/Federation/End今すぐ。

更新 2

別の投稿で示したように、APIコントローラーも試しました:

public class FederationController : ApiController {

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

    return response;
}
public string Get()
{
    return "hello world";
}
protected virtual string ExtractBootstrapToken()
{
    return "Hello World";
}

}

現在、ログイン画面がハングアップし、探しているサービスは現在準備ができていません (またはそのようなもの) で終了します。

acs リターン URLhttp://localhost:48451/api/Federation

        WebAuthenticationResult webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
WebAuthenticationOptions.None,
new Uri("https://traffictheory.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a909090%2f"),
new Uri("http://localhost:909090/api/federation/end"));
4

1 に答える 1

3

は、次にWebAuthenticationBroker要求されたページがパラメーターで指定されたページになるまで、単にブラウジングを続けcallbackUriます。その時点で、最終的な URL が返されるため、何かを取得したい場合は、その URL でエンコードする必要があります。

証明書利用者の ACS コントロール パネルで、サイトのどこかにあるリターン URL を指定する必要があります。たとえばhttps://traffictheory.azurewebsites.net/federationcallback。次に、その URL への投稿の受け入れを処理するコントローラーを作成します。投稿にはwresult、ACS から返されたトークンを含む xml であるフォーム フィールドがあります。

WebAuthenticationBroker次に、にリダイレクトすることにより、トークンを に送り返すことができます。https://traffictheory.azurewebsites.net/federationcallback/end?token={whatever you want to return}

次に、認証ブローカーの使用法を次のように変更する必要があります。

var webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
            WebAuthenticationOptions.None,
            new Uri("https://s-innovations.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=http%3a%2f%2ftraffictheory.azurewebsites.net%2f"),
            new Uri("https://traffictheory.azurewebsites.net/federationcallback/end")
        );

// The data you returned
var token = authenticateResult.ResponseData.Substring(authenticateResult.ResponseData.IndexOf("token=", StringComparison.Ordinal) + 6);

認証コールバック ポストを処理するためのコントローラーは次のようになります。

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();
    }
}

BootstrapToken()拡張メソッドはwif.swtNuGet パッケージの一部です。デフォルトでは、WIF はブートストラップ トークン プロパティに何も保存しません。web.configの下の要素にsaveBootstrapTokens="true"属性を含めて有効にする必要があります。私は次のようになります。<service><microsoft.identityModel>

<microsoft.identityModel>
    <service saveBootstrapTokens="true">
        <audienceUris>
            <add value="http://localhost:3949/" />
        </audienceUris>
        <federatedAuthentication>
            <wsFederation passiveRedirectEnabled="true" issuer="https://xyz.accesscontrol.windows.net/v2/wsfederation" realm="http://localhost:3949/" reply="http://localhost:3949/" requireHttps="false" />
            <cookieHandler requireSsl="false" path="/" />
        </federatedAuthentication>
        <issuerNameRegistry type="Microsoft.IdentityModel.Swt.SwtIssuerNameRegistry, Wif.Swt">
            <trustedIssuers>
                <add name="https://readify.accesscontrol.windows.net/" thumbprint="{thumbprint}" />
            </trustedIssuers>
        </issuerNameRegistry>
        <securityTokenHandlers>
            <add type="Microsoft.IdentityModel.Swt.SwtSecurityTokenHandler, Wif.Swt" />
        </securityTokenHandlers>
        <issuerTokenResolver type="Microsoft.IdentityModel.Swt.SwtIssuerTokenResolver, Wif.Swt" />
    </service>
</microsoft.identityModel>
于 2012-09-27T03:02:34.767 に答える