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をどう処理するかを理解できるようにします。