WCFサービスはサーバー2012で認証に失敗しましたが、Win7でOK?
-
20-12-2019 - |
質問
ロールベース認証と承認を備えたWCFサービスを作成しました。そして各操作の実装は
のようなものです。[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.Customer)]
[PrincipalPermission(SecurityAction.Demand, Role = RoleConstants.CustomerStaff)]
public void DoSomething()
{
}
.
会員プロバイダとroleManagerは、GACではなくMySQL用のものです。 SSL証明書は、HTTPSのIIS 7によって生成されます。
と私は
のような統合テストを持っていますusing (var client = new MyProxy("DefaultBinding_ILicensingService"))
{
client.ClientCredentials.UserName.UserName = "AbcShop";
client.ClientCredentials.UserName.Password = "tttttttt";
client.DoSomething();
}
.
1つのインスタンスがWin7のDevマシン上で実行されており、もう1つはサーバー2012のテストサーバー上にあります。両方のWCFサービスのインスタンスがうまく機能していました。
しかし、1ヶ月後、サーバー2012上のインスタンスがもう動作していないことを発見し、認証に失敗し、次のメッセージが表示されます。
更新:
System.ServiceModel.Security.MessageSecurityException : An unsecured or incorrectly secured fault was received from the other party. See the inner FaultException for the fault code and detail.
---- System.ServiceModel.FaultException : An error occurred when verifying security for the message.
Stack Trace:
Server stack trace:
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout)
at System.ServiceModel.Channels.SecurityChannelFactory`1.SecurityRequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
.
更新:
私は以下を観察し、いくつかの可能な原因を除外しました。
- 両方のマシンのAUTHデータベースは同一であり、クライアントがリクエストを行った後にメンバー情報を取得するようにSQLクエリを検索するようにSQLクエリを作成していることがわかりました。
- 私は、両方のマシンにIISのバインディングと設定を比較し、基本的には一部のアドレスを除いて同一です。
- イベントビューアは、WCFサービスに関する警告を表示しません。
- WCFサービスの実装は、この属性が属しています.publicクラスErrorHandlerBehaviorAttribute:属性、iserviceBehavior、iErrorHandler、およびすべてのキャッチャーの例外は、エラーをログファイルに記録するこの属性に行きます。ただし、ログファイルは何も記録されていません。この問題
と私は両方のインスタンスで負荷したアセンブリを比較しました。 Windows 7では、システムアセンブリは基本的にWindows \ Microsoft.NET \ Asplement \ GACXXX \ XXXからのものですが、サーバー2012では、一部のアセンブリはWindows \ Assembly \ Assemblates_v4.0.30319_64からのものです。 P>
System
System.Activities
System.Core
System.Data.DataSetExtensions
System.Drawing
System.Enumerics
System.ServiceModel.Activities
System.WorkflowServices
System.XAML
System.ServiceModel.Web
.
対照的に、WIN 7では、システムのみが有効画像からのものです。アセンブリやネイティブイメージの場所が行動を変えることができるかどうかはわかりません。
サービスとクライアントは、.NET Framework 4.5のVS 2012を使用して開発されています。
サーバー2012にインスタンスを失敗させる可能性があるため、他に何が失敗する可能性がありますか?
解決
問題解決
原因のルート:サーバ2012でASP .NET MVCアセンブリを見つかりません。
背景は、WCFサービスにMVCアプリケーションを将来構築されるように、同じ認証データベースを共有したいと思います。そのため、メンバープロバイダーとAuth ManagerはMVCのものであり、データベースはMySQLです。そのため、プロバイダはMVCと結合されているオープンソースのサードパーティのコンポーネントからのものです。
私の取り消した例外ハンドラとイベントビューアが不足しているアセンブリについての警告をキャッチできなかった理由は次のとおりです。 1. DEV PCはGACを愛した以前の開発者によって使用されました。あなたはGACがDev PCでたくさんの問題を引き起こす可能性があることを知っています。 MVC 1,2、および3からの集合トンはGAC中であった。 2. MVCと対話している3番目の構成要素には、不足しているアセンブリについてのいくつかの例外がいくつか嚥下するいくつかの貧弱なプログラミング練習があります。
ロードされたアセンブリを両方のマシンで1つずつ比較した後、サーバ2012上のWCFサービスインスタンスにWebMatrix.WebData.dllが見つかりました。アセンブリを仮想ディレクトリのBINディレクトリにコピーしたら、私は不足しているアセンブリを1つずつ報告した後に、より多くの不足しているアセンブリについてのエラーメッセージの連鎖を得ました。これらのアセンブリは基本的にMVCに属しています。 HTMLのサービスからの応答のクライアント側、およびサーバー側のイベントビューアにエラーメッセージが表示されました。
だから私は展開スクリプトがそれぞれのアセンブリを含めるようにしています。
明らかに、認証データベースから取得した会員情報の後に、サービスはさらなる処理のためにINFOをMVCの他のアセンブリに委任し、どういうわけか3番目のコンポーネントが不足しているアセンブリについての例外を飲み込んだ。そして認証の他の部分は間違った信号を得てから、「セキュリティの確認...」に関する誤解を招く警告メッセージを与えました。
レッスンは次のとおりです。 1. Dev MachineでGACをしないでください。あなたが誰かからDev Machineを受け継いだ場合は、Xcopyを通じてプライベートアセンブリであるべきであるいくつかのUn-GACにいつか投資してください。 2.一部の第三者のコンポーネントは、防御的なプログラミングに対していくつかの汚れた練習をするかもしれません。私の場合、コンポーネントは欠けているアセンブリについての警告を飲み込んだ。 他の考えられる原因を調べる前に、負荷付きアセンブリを比較するのが安価です。 Process Explorerを使用して、w3wp.exeのロードされたアセンブリをリストします。