複数の WCF サービスを呼び出す Silverlight 4 クライアントがあります。SSL を使用して通信を暗号化し (この部分は既に解決しています)、すべての呼び出しが AD LDS (ADAM) に対して認証されるようにしたいのですが、これを機能させる方法を示す簡単な例はありますか? 非常に多くの WCF オプションに関するドキュメントはたくさんありますが、この特定の (しかし非常に一般的だと思います) シナリオ (SSL 暗号化 + ADAM 認証 + Silverlight) の簡単な動作例を見つけることができませんでした。どんな助けや指針も大歓迎です。
4 に答える
これらの関数にはASP.netのメンバーシッププロバイダーを使用するため、答えは、アクセス許可をどのように処理するかによって異なる場合があります。
クレームベースの承認が必要な場合は、ADFS 1.0(2.0ではない)がADAMをサポートします。より多くのオプションがあるSTSが必要な場合は、codplexのStarterSTSを試してください
ロールベースの管理を使用する場合は、Microsoft P&PのEnterprise Library、ASP.netメンバーシッププロバイダー、または承認マネージャー(旧称AzMan)へのCOMアクセスを直接試してください。
私はクレームベースのアプローチを好み、使用します。
- ActiveDirectory + ADFS 2.0を
使用します(組み込みのフォールトトレランスとADのレプリケーションを使用しないのはなぜですか?ADAMは面倒です) - ここに記載されているWs-TrustのSilverlight実装:http: //www.leastprivilege.com/UsingSilverlightToAccessWIFSecuredWCFServices.aspx
Codeplex Web サイトでこのリンクを試してください。説明したシナリオのセットアップと構成のようです。必要なすべての設定の完全なチェックリストを提供します。
イントラネット – トランスポート セキュリティ (信頼されたサブシステム、HTTP) を使用した Web からリモート WCF へ
これが正確なシナリオでない場合は、次のセクションを参照してください。ギャップを埋める可能性があります。
WCF で CustomUserNameValidator を使用できます: http://msdn.microsoft.com/en-us/library/aa702565.aspx http://nayyeri.net/custom-username-and-password-authentication-in-wcf-3- 5
Custom Validator の Validate Method では、ADAM にクエリを実行してユーザーを認証できます。
よろしく。
エドガー、私もあなたの結果に興味があります。私はあなたがいたのと同じ場所にいます.
Shoaib、私はこれを見てきましたが、ActiveDirectoryMembershipProviderを介して.configのみを使用するよりも望ましくないと思います。それは、独自のセキュリティシステムを作成するのではなく、既製のコンポーネントを使用しているだけだからです.
編集:これが誰かに役立つことを願っています。インターネット上にこれの良い例がないとは信じられません。それは十分に簡単です。前に述べたように、これはカスタム認証システムを使用するよりも優れています。
Silverlight 互換の WCF 呼び出し (wsHttp 以外) で AD LDS (ADAM) 認証を使用する
クライアント側:
1) Silverlight からの呼び出しは次のようになります。これは、Channel Factory も使用している場合に機能します。
var client = new MyWCFServiceClient();
client.GetPersonCompleted += client_GetPersonCompleted;
client.ClientCredentials.UserName.UserName = username;
client.ClientCredentials.UserName.Password = password;
client.GetPersonAsync();
2) ログインが失敗した場合、サーバーからの戻り値には Error プロパティが含まれます。ユーザー ルックアップが失敗した場合、エラーは「少なくとも 1 つのセキュリティ トークンを検証できませんでした」のような紛らわしいものです。サーバー側のコードはこれを再ラップできないため (すべて web.config で発生しているため)、クライアント コードで System.ServiceModel.Security.MessageSecurityException をキャッチしてログインの失敗として解釈するか、チェックすることをお勧めします。 InnerException メッセージで、それが「セキュリティ トークン」であることを確認します。
void client_GetPersonCompleted(object sender, GetPersonCompletedEventArgs e)
{
if (e.Error == null)
{
// do stuff with e.Result;
}
if (e.Error is MessageSecurityException)
{
// Your login did not work
}
}
サーバ側:
1) WCF サービス クラスには、[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] または Required が必要です。
2) SSL を有効にして LDS インスタンスをセットアップする必要がありますが、これは注意が必要です。参照: h't't'p://erlend.oftedal.no/blog/?blogid=7
3) Web 構成 - 以下が必要です。
- LDS 接続文字列を追加する
- ActiveDirectoryMembershipProvider を追加します
- 追加
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
- カスタム バインディングを変更して、 http://msdn.microsoft.com/en-us/library/dd833059( VS.95
<security authenticationMode="UserNameOverTransport"/>
).aspx を参照 してください
例:
<configuration>
<connectionStrings>
<add name="ADConnectionString" connectionString="LDAP://myserver:[SSL port number]/[where your user are in LDS, in my case: ‘OU=ADAM Users,O=Microsoft,C=US’]" />
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<membership defaultProvider="MyActiveDirectoryMembershipProvider">
<providers>
<add
name="MyActiveDirectoryMembershipProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ADConnectionString"
connectionUsername="[domain]\[username]"
connectionPassword="[plain text windows password]"
connectionProtection="Secure"
/>
</providers>
</membership>
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehaviour">
<serviceMetadata
httpsGetEnabled="true"
httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="MyActiveDirectoryMembershipProvider"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="myCustomBinding">
<security authenticationMode="UserNameOverTransport"/>
<!-- <binaryMessageEncoding /> this is optional, but good for performance-->
<httpsTransport />
</binding>
</customBinding>
</bindings>
<services>
<service name="MessageBasedSecurity.Web.MyWCFService" behaviorConfiguration="MyServiceBehaviour">
<endpoint address="" binding="customBinding" bindingConfiguration="myCustomBinding"
contract="MessageBasedSecurity.Web.MyWCFService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>
これが誰かに役立つことを願っています。コメント/改善を歓迎します。