11

リモート WCF Web サービスと通信する Web サイトがあります。どちらも同じカスタム FormsAuthentication Provider を使用します。現在サイトにログインしているユーザーを偽装する WCF サービスで認証したいと考えています。UserName クライアントの資格情報を使用して手動でこれを既に行っていますが、ユーザーのパスワードを知る必要があります。認証されたユーザーがリクエストを行い、サービス クライアントを作成して資格情報を設定します。

serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;

しかし、ユーザーのパスワードを保存したくないので、FormsAuthentication Cookie を直接渡したいと思っています。

何か案は?

4

2 に答える 2

13

WindowsCommunicationFoundation認証サービスを探しているようです。

編集:

質問をもっと注意深く読み直した後(そしてアリエルのコメントの後)、私は上記の提案を撤回したいと思います。WCF認証サービスは、このシナリオに多くを追加しません。

WCFとASP.NETの間でこれを行ったことはありませんが、フォーム認証されたユーザーを共有するようにASP.NETアプリケーションを構成しました。おそらく、何らかの方法で支援できます。

両方のアプリケーションが同じ方法でフォーム認証Cookieを暗号化/復号化できるようにするには、両方のアプリケーションの要素を構成する<machineKey>必要があります(これをマシンレベルまたはアプリケーションレベルで行うかどうかに応じて、web.configまたはmachine.configで)。validation、、、および属性を確認する必要がvalidationKeyあります。decryptiondecryptionKey

<forms>両方のweb.configファイルの要素が同じように構成されていることを確認してください。具体的には、、nameおよびpath属性domain

これは、Webブラウザとの間でやり取りされるCookieにのみ適用される可能性があります(ただし、この場合は便利です)。Webサイトwww.foo.combar.foo.comformsの間でCookieを渡すことができるようにするには、要素を構成します。次のようにして、Cookieを一方のサイトに設定し、もう一方のサイトに正常に渡すことができます。

<forms ... domain=".foo.com" ... />

CookieをWCFサービスに渡すのは、難しい作業になる可能性があります。私はWCFの経験があまりないので、kennyw.comのコードを採用しました

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>");

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel))
{
  OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  serviceClient.MethodName();
} 

IIS内でWCFをホストしている(セルフホスティングではない)場合は、次のように設定することで、ASP.NET処理パイプラインを介してWCF要求を渡すことができます。

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>

セルフホスティングの場合は、の着信メッセージのプロパティを使用してリクエストヘッダーを調べ、OperationContext.Current.IncomingMessagePropertiesフォーム認証Cookie値を取得し、を使用して復号化できFormsAuthentication.Decrypt(string)ます。

これがうまくいくかどうかはわかりませんが、うまくいくかどうか聞いてみたいです!

于 2009-07-06T14:35:46.853 に答える
4

認証された IIS サイト内で WCF サービスをホストする場合は、簡単に実行できます。

web.config の system.ServiceModel セクションに以下を追加して、互換性を有効にします。

<system.serviceModel>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>

次に、Cookie を受け入れたい各サービスを次のように装飾します。

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

これで、HttpContext.Current.User.Identity オブジェクトが正しく設定され、PrinciplePermission 要求を使用して、ロールまたは特定のユーザーへのアクセスを制限することもできます。

于 2009-07-06T21:19:19.283 に答える