2009-07-18 45 views
5

私はSilverlight v3 Webアプリケーションを開発中です。データを取得するために使用しているWCFサービスへのアクセスを保護したいと思います。私は現在、WCFを正常に動作させていますが、ユーザー資格情報は必要ありません。WCF +ユーザー資格情報

私はWCFのこの側面に慣れていないので、私の最初のアイデアは、私のサービスの各操作にユーザー名とパスワードのパラメータを追加することでした。私がこれを持っている問題は、これは多くの冗長なコードと、ユーザー名とパスワードがプレーンテキストのワイヤーを介して転送されるという事実を必要とすることです。

サービスプロキシを作成した直後にクライアント側で資格情報を指定する方法があります(「サービス参照の追加」から自動生成されたプロキシを使用しています)。

私の最初のアイデア(ユーザー名/パスワードのパラメータを使用)と同様の解決策しか見つけられませんでした。誰かが正しい方向に私を指差してくれますか?

ありがとうございます!

答えて

7

これらのユーザー名とパスワードはどこから来ていますか? Webサイトでフォーム認証がすでに実装されている場合は、自分で認証情報を設定しないで、フォーム認証Cookieを使用できます。ユーザーがログインしている場合、CookieはWebサービスコールと共に移動します。反対側でそれを読むには、いくつかの変更を加える必要があります。それは、各サービスメソッドのために、その後に行われたらあなたはASP.NET Cookieは追加理解したい

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

まずあなたはsystem.ServiceModelセクションでWCFのためのASP.NET互換モードを有効にする必要があります各メソッド内のサービス・クラス

[ServiceContract] 
[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class ExampleService 
{ 
} 

へ[AspNetCompatibilityRequirements]属性は、ユーザーの身元を発見するためにHttpContext.Current.User.Identityオブジェクトにアクセスすることができます。ボーナスとして

あなたが唯一の特定のメソッドは、認証済みのユーザーによって呼び出されるようにしたいなら、あなたはこのようにPrincipalPermissionを使用することができます

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)] 
public string Echo() 

あなたはASP.NETのロールプロバイダを使用している場合はそれらも移入され、

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Role="Administators")] 
public string NukeTheSiteFromOrbit() 

そして、これは明らかにもSilverlight2で動作します:あなたは、特定のロールのメンバーにそれらを制限する方法にPrincipalPermissionを使用することができます。

+0

いいですね。生のhttpwebrequestを使用している場合、これ(または同様のもの)が使用可能かどうか知りませんか?私は同じ方法で保護したいカスタムRPCスタックを持っています(私はもちろん、新しいクエストンとして尋ねることができます)。 –

+0

それははいです。 http://www.silverlightshow.net/items/Cookies-in-Silverlight-Web-Requests.aspx – blowdart

+0

Taを参照してください。私はそれを見ます;-p –

0

何らかの認証オブジェクトを渡して、WCFを使用してメッセージレベルで暗号化することができます。 C#の側面(http://www.postsharp.org/)を使用すると、冗長ロジックを避けることができます。それはそれを処理する非常にきれいな方法です。

1

あなた自身をロールしたり、明示的なパラメータを追加したりしないでください。実際にはあまりにも多くの作業が必要です。

WCFのセキュリティ機能をチェックしてください - それらの多くは利用可能です!たとえば、メッセージを保護し、メッセージの中に資格を入れてください。あなたの側で余分なコーディングは必要ありません。

ミケーレルルーブスタマンテにより、WCFセキュリティ上のこの優れた記事チェックアウト:あなたのケースではhttp://www.devx.com/codemag/Article/33342

を、私は、ユーザー名の資格情報を使用してメッセージセキュリティをお勧めしたい - あなたは、両端にこれを設定する必要があります。

サーバー側:あなたは、クライアント側で同じ設定を適用する必要が

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<services> 
    <service name="YourService"> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
    </service> 
</services> 

そして:

<bindings> 
    <basicHttpBinding> 
    <binding name="SecuredBasicHttp" > 
     <security mode="Message"> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost:8000/MyService" 
       binding="basicHttpBinding" 
       bindingConfiguration="SecuredBasicHttp" 
       contract="IYourService" /> 
</client> 

今、あなたのサーバとクライアントがセキュリティに合意 - クライアント上で、あなたは次のように使用するユーザー名とパスワードを指定したい:サーバー側で

YourServiceClient client = new YourServiceClient(); 

client.ClientCredentials.UserName.UserName = "your user name"; 
client.ClientCredentials.UserName.Password = "top$secret"; 

、あなたが必要となります通常はWindowsドメイン(Active Directory)に対して、またはASP.NETメンバーシッププロバイダモデルに対して、これらのユーザー資格情報の検証方法を設定します。いずれにしても、定義したストアに対してユーザーの資格情報を検証できない場合、その呼び出しは拒否されます。

これはビットセキュリティがWCFの大きな話題であり、たくさんのオプションを持っていることを願っています。少し難しいかもしれませんが、最終的には通常意味があります! :-)

マーク

+6

私はあなたがこれを行うことができたどのシナリオか分かりませんが、私の経験上、これはWCFでは許可されていません。 basicHttpBindingではメッセージモードのユーザー名と資格情報のセキュリティを使用できません。資格情報がプレーンテキストで渡されるため、フレームワークでは許可されません。このInvalidOperationExceptionが発生します: "BasicHttpバインディングでは、BasicHttpBinding.Security.Message.ClientCredentialTypeが安全なメッセージのBasicHttpMessageCredentialType.Certificate資格情報タイプと同等である必要があります。ユーザー名資格情報のTransportまたはTransportWithMessageCredentialセキュリティを選択してください。 – Grank

関連する問題