0

WCF Data Services / ODATAサーバーにWIFサポートを追加する作業を行っています。最初に実行したいのは、サーバーに何らかのIDを渡すnUnitテストを作成することです。これはアクティブなクライアントのカテゴリに分類されると思います。UIはありません。app.configで確立されたプロバイダー(Google、Yahoo、Windows Live、またはその他のプロバイダー)に電話をかけて IDトークンを取得したいと思います。率直に言って、それは多かれ少なかれ常にアクセス可能であり、テストを実行するための管理がないということだけで、何でも構いません。(IPとして機能するソリューションに含めることができるホストアプリがあれば、それで完全に満足します。)

私の既存のテストはすべてHttpRequestを直接使用しています-生成されたクライアントを使用していません。HttpRequestオブジェクトを作成しているときに、ヘッダーに入れる認証トークンがすでにあるかどうかを確認します。そうでない場合、私は次のようなことを試みています:

using (WSTrustChannelFactory factory = new WSTrustChannelFactory(
   new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
   new EndpointAddress(new Uri("https://dev.login.live.com/wstlogin.srf"))))
{
   factory.Credentials.UserName.UserName = "MYUSERNAME";
   factory.Credentials.UserName.Password = "MYPASSWORD";
   factory.TrustVersion = TrustVersion.WSTrust13;

   WSTrustChannel channel = null;
   try
   {
     var rst = new RequestSecurityToken
     {
       RequestType = WSTrust13Constants.RequestTypes.Issue,
       AppliesTo = new EndpointAddress("http://localhost:60711/Service"),
       KeyType = WSTrust13Constants.KeyTypes.Bearer,
     };

    channel = (WSTrustChannel)factory.CreateChannel();
    return channel.Issue(rst);
  }
  finally
  {
    if (null != channel)
    {
      channel.Abort();
    }
    factory.Abort();
  }
}

始めに...IPの正しいURIを目指しているかどうかさえわかりませんが、それを変更したときに404を取得したので、おそらく正しい方向に進んでいると思います。現時点では、channel.Issueメソッドは、FaultExceptionタイプの内部例外を含むMessageSecurityExceptionを返し、「InvalidRequest」に注意します。FaultExceptionには、Name=SenderおよびNamespace=http://www.w3.org/2003/05/soap-envelopeのコードがあり、Name=InvalidRequestおよびNamespace=http://schemas.xmlsoapのサブコードがあります。 org / ws / 2005/02/trust。この情報をどうしたらいいのかわかりません。:)

非常に基本的な質問をしている場合は、お詫び申し上げます。私はほんの数日間認証を検討してきましたが、まだ自分のやり方がわかりません。助けてくれてありがとう!

編集-ソリューション

Eugenioは正しいです-私は少し重いことをしています、そしてそれは統合テストのものです。私はGoogle/Yahoo / Liveのものを捨てて、SelfSTSの修正版を見つけました。それを自分のプロジェクトに取り入れました。まだ何が起こっているのか完全には理解していませんが、SAMLトークンを取り戻しました。最終的なコードは次のとおりです。

var binding = new WS2007HttpBinding();

binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Message.NegotiateServiceCredential = true;

using (var trustChannelFactory = new WSTrustChannelFactory(binding, new EndpointAddress(new Uri("http://localhost:8099/STS/Username"), new DnsEndpointIdentity("adventureWorks"), new AddressHeaderCollection())))
{
  trustChannelFactory.Credentials.UserName.UserName = MYUSERNAME;
  trustChannelFactory.Credentials.UserName.Password = MYPASSWORD;
  trustChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
  trustChannelFactory.TrustVersion = TrustVersion.WSTrust13;

  WSTrustChannel channel = null;

  try
  {
    var rst = new RequestSecurityToken(WSTrust13Constants.RequestTypes.Issue)
    {
      AppliesTo = new EndpointAddress("http://localhost:60711/Service"),
      KeyType = WSTrust13Constants.KeyTypes.Bearer
    };

    channel = (WSTrustChannel)trustChannelFactory.CreateChannel();
    GenericXmlSecurityToken token = channel.Issue(rst) as GenericXmlSecurityToken;
    ((IChannel)channel).Close();
    channel = null;

    trustChannelFactory.Close();

    string tokenString = token.TokenXml.OuterXml;
    return tokenString;
  }
  finally
  {
    if (null != channel)
    {
      ((IChannel)channel).Abort();
    }
    trustChannelFactory.Abort();
  }
}

(このコードは、変更されたSelfSTSを入手したのと同じ場所からも削除されています-ありがとう、Wade Wegner!)

「adventureWorks」の使い方がよくわかりません。構成で発行者名として使用しているSelfSTSのバージョンですが、相関関係があるかどうかを確認していません。

では、実際のサーバーをハックして、SAMLをどう処理するかを理解できるようにします。

4

1 に答える 1

0

これらのIPのすべてがアクティブな呼び出しをサポートしているわけではありません。たとえそうだとしても、プロトコルは互換性がないかもしれません。

たとえば、GoogleがWS-Trust(WIFが内部で使用しているもの)を実装しているかどうかはわかりません。LiveIDのどこかにWS-Trustエンドポイントがある可能性がありますが、それが公式にサポート/文書化されているかどうかはわかりません(たとえば、LiveIDがRPを認識していないために発生するエラーが発生する可能性があります:http:// localhost:60711 / Service ;したがって、トークンを発行することはできません)。

このような複数のIPの場合、アプリは通常、Webブラウザーを埋め込み、それをすべてのトークンネゴシエーションに使用します(たとえば、WS-Federationを使用)。また、多くの場合、プロトコルの移行を処理するために専用のSTSに依存しています(Windows Azureアクセス制御サービスなど)。

いずれにせよ、あなたがしていることは、ユニットテストでは少し重いように聞こえます。自動化したい統合テストのように聞こえます。

たぶん、あなたはあなた自身のカスタム(偽の)STSから始めることができます。すべてを制御し、さまざまな出力(たとえば、さまざまなクレームなど)をシミュレートできます。

この章: http: //msdn.microsoft.com/en-us/library/hh446528(およびサンプル)で詳細を確認できます。

于 2012-08-17T18:01:42.007 に答える