2009-06-15 14 views
3

(Windowsフォーム)クライアントが実行されているものとは異なるWindowsドメインで実行されているWebサービスを呼び出す必要があります.WebサービスはWindows認証を使用して保護されています。保存された資格情報を使用してWebサービスを呼び出す方法は?

Webサービスのドメインのドメイン資格情報は、クライアントのユーザープロファイル(XPでは保存されたユーザー名とパスワード)に保存されますが、Webサービスを呼び出すときにこれらの保存された資格情報を使用する方法を把握できませんでした。私は(ユーザー名、パスワードた、(それがローカルドメインの資格情報だから、これは動作しません)

WebService1.Credentials = System.Net.CredentialCache.DefaultCredentials 

を使用して

または

WebService1.Credentials = new NetworkCredentials(username, pwd, domain) 

の例をたくさん見つけましたドメインはハードコードされています)。

私は、WindowsのAPIを使用してCredEnumerateCredReadを使用して上に読んだが、どのように(または場合)を知らない私は(ReadCredが保存されたドメインの資格情報のパスワードを返さない)管理NetworkCredentialPCREDENTIALを変換することができます

ここで誰もこれを行う方法を知っていますか?

ありがとうございます!

答えて

1

OK、私は自分の質問に答えるつもりですので、解決策を見つけましたapp.configファイルの設定。

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" realm="mydomain.com" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://server.mydomain.com/HelloWorldSvc/Service1.asmx" 
       binding="basicHttpBinding" bindingConfiguration="Service1Soap" 
       contract="ServiceReference1.Service1Soap" name="Service1Soap" /> 
     </client> 
    </system.serviceModel> 

次私はCredUIPromptForCredentials API関数にHernan de Lahitte's優れたwrapperを使用:(私のシナリオでは)キーは、唯一の輸送資格のためのモードを設定するタイプとしてWindowsを指定して、レルム属性でドメインを特定することですセキュリティ例外がスローされてそのプロファイルに格納された場合、ユーザーに資格情報の入力を求めてプロファイルに保存します。

ServiceReference1.Service1SoapClient c = new Service1SoapClient(); 
retry: 
try 
{ 
    MessageBox.Show(this, c.HelloWorld()); 
} 
catch (System.ServiceModel.Security.MessageSecurityException securityException) 
{ 
    UserCredentialsDialog creds = new UserCredentialsDialog("*.mydomain.com", "My App", 
                     "Enter your enterprise credentials. Enter your user name as \"MyDomain\\username\""); 
    creds.Flags = UserCredentialsDialogFlags.Persist; 
    if (creds.ShowDialog() == DialogResult.OK) 
    { 
     goto retry; 
    } 
} 

c.Close(); 

はい、これは「goto」です。 ****ガス**** :)

1

私はあなたがそれらを直接使用できるとは思わない。私はあなたがそれらのためにユーザーにプロンプ​​トする必要があると思うし、ユーザーがそれらを提供したら、再度プロンプトすることができます。 Here is an article on how to do that。その後、DPAPIから資格情報を取得することができれば、それは目的を破るでしょう。 :)

ここにいくつかの情報があります。その場合に役立ちます...

DPAPIのデータを保持するマネージャーは、Key Managerと呼ばれます。あなたは一般的には...実行スタート - >を行うことによって、UIから

rundll32.exe keymgr.dll, KRShowKeyMgr 

をキーマネージャにアクセスすることができ、認証機能が保存されている場所のためのAPIがADVAPI32です。あなたがそこにあなたを助けるために何かを見つけることができるかもしれません。このAPIにはdecent articleがあります。

資格情報をCredentialCacheに追加するときには、authType "Negotiate"described hereとして試してみることもできます。

申し訳ありませんが、これはちょうどリサーチダンプです - 私は答えが見つかりませんでしたが、うまくいけばこのうちのいくつかがあなたを助けるかもしれません。 GL。

0

私はあなたの唯一のオプションは私の知る限り、あなたは、コード内でそれらを使用することができるとは思わない:あなたは(ノーノー大きなほとんどのケースで)書かれているとしてユーザー名/パスワードをハードコーディング

  1. ユーザーのドメインアカウントがサービスを呼び出すことができるように、両方のドメインとマシン間で信頼関係を持つKerberosを設定します。私は新しいWCFスタイルのプロキシクラスを使用することにより、「サービス参照」はあなたがセキュリティを設定することを可能にすることを発見し、

    まず: