2009-07-06 9 views
11

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

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

しかし、私が本当にしたいことはので、私ドン、直接をFormsAuthenticationクッキーを渡すことですユーザーのパスワードを保存したくない。

アイデア?

+0

こんにちはアリエル、どうやってこれに乗りましたか?私は似たような問題を持つ人を知っ –

答えて

13

あなたはWindows Communication Foundation Authentication Serviceを探しているようですね。

EDIT:私は上記の提案を撤回したいのですが、より慎重に質問を再読み込み(とアリエルのコメントの後)後

。このシナリオでは、WCF認証サービスはほとんど追加されません。

私はこれをWCFとASP.NETの間で行っていませんが、フォーム認証されたユーザーを共有するようにASP.NETアプリケーションを構成しました。

両方のアプリケーションが同じ方法でフォーム認証Cookieを暗号化/復号化できるようにするには、両方のアプリケーション(マシンまたはアプリケーションレベルでこれを実行するかどうかによって、両方のアプリケーションに対してconfigure the <machineKey> element) )。 validation,validationKeydecryption、およびdecryptionKey属性を見てください。

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

これはWebブラウザのみへ/から渡されたクッキーに適用されます(ただし、この場合に有用であるかもしれない)という可能性があります:クッキーは、ウェブサイトの間で渡すことができるようにするにはwww.foo.combar.foo .COMクッキーは、他の1つのサイトに設定し、正常に渡すことができるようにするために、次のようにあなたがforms要素を構成します

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

WCFサービスにクッキーを渡すには、トリッキーなビットである可能性が高いです。私は、WCFと非常に経験ないんだけど、そうI've adapted code from 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)を使用して、それを解読できホスティング自己をしている場合。

私はこれがうまくいくかどうかは分かりませんが、もしそうであれば聞きたいです!

+0

認証サービスがどのように役立つかわかりません。 私のシナリオは次のとおりです。 USER - > Web Site A - > WCFサービスBが他の場所にホストされています ユーザーがA、Aにログインすると、ユーザー資格情報を使用してBが呼び出されます。 認証サービスはどこに追加しますか? –

+0

こんにちはアリエル。申し訳ありませんが、本当にあなたの質問を読まずに、あまりにも早く答えを試みました。私は更新でそれを編集します。 – dariom

+0

提案をありがとう、私はそれを試し、ここで結果を共有します。 –

4

認証されたIISサイト内でWCFサービスをホストするのは簡単です。

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

は、その後、あなたが今、次の

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

とクッキーを受け入れたく各サービスを飾るあなたのweb.configファイルであなたのsystem.ServiceModelセクションに以下を追加することで、互換性を有効にしますHttpContext.Current.User.Identityオブジェクトが正しく読み込まれ、PrinciplePermissionの要求を使用して、ロールまたは特定のユーザーによるアクセスを制限することもできます。

+0

それは問題です、私は同じIISを使用することはできません。私が構築しているシステムの要件は、別のマシンでWebサイトとサービスをホストすることでした。 共有トークンの使用を検討していますが、Formsを使用するのはASP.netからの実装が最も簡単なソリューションでした。 –

+0

ああああ!あなたは少なくとも同じドメイン名にそれらを置くことができますか?もしそうなら、あなたはフォームの認証クッキースコープを設定し、それをそのように共有することができます。 – blowdart

+0

私はこう考えています。アプリケーションは、単一のルートドメインの下にあるイントラネットでホストされます。同じマシンキーを設定することもできますが、ユーザーがWebサイトにアクセスしていることに注意し、WebサイトはWCFをユーザーを偽装するデータソースとして使用します。 Windows認証で正常に動作しますが、FormsAuthentication Cookieを渡すことは別の話です。私はダリオムの提案(または利用可能であれば他のもの)を試みます。 –

関連する問題