解決 策 私の実用的な解決策は、回答または更新 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"));