0

RoleProvider を継承するカスタム ロール プロバイダーがあります。Web アプリでは、これは問題なく正常に動作します。

ただし、WCF サービスでも使用しており、ステップインするのに大きな問題があります。まったく当たらないのではないかと思うほどです。プリンシパルのアクセス許可をまったくオンにすると、アクセスが拒否され、スタック トレースはまったく役に立ちません。WCF トレースでさえ、何が起こったのかを確認するのに非常に役立ちません。

私は、TennisRoleProvider がデフォルトのコンストラクターから動作し、テストによってそのメソッドを検証したことを知っています。統合の問題のようです。

だからスニペット...

EDIT:その後、ロールプロバイダーをサービスアセンブリに移動しました.GAKとキーを含める必要があることについて何かを読んでください(完全な信頼で実行する必要があります)。私はその道をたどりましたが、それでもうまくいかなかったので、単純化するために単純にサービスプロジェクトに移動することにしました。まだ喜びはありません。

<roleManager defaultProvider="TennisRoleProvider"
             enabled="true"
             >
  <providers>
    <clear/>
    <add name="TennisRoleProvider"
         type="Tennis.Security.TennisRoleProvider, Tennis.Security" />
  </providers>
</roleManager>

   <bindings>
     <wsHttpBinding>
        <binding name="wsHttpUserName">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName"/>
            <transport clientCredentialType="None"/>
          </security>
        </binding>
     </wsHttpBinding>
   <bindings/>


    <behavior name="RoleBehavior">
       <serviceCredentials>
         <serviceCertificate findValue="john-pc"
                      storeLocation="LocalMachine"
                      storeName="My"
                      x509FindType="FindBySubjectName"/>
       <userNameAuthentication userNamePasswordValidationMode="Custom" 
customUserNamePasswordValidatorType="Tennis.Components.TennisUserValidator, Tennis.Components"/>
      </serviceCredentials>

      <serviceAuthorization principalPermissionMode="UseAspNetRoles" 
                            roleProviderName="TennisRoleProvider">
      </serviceAuthorization>

      <serviceMetadata httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <errorHandler />
    </behavior>

   <services>
      <service name="Tennis.Service.Services"
               behaviorConfiguration="RoleBehavior">
          <endpoint address="Family"
                 binding="wsHttpBinding"
                 bindingConfiguration="wsHttpUserName"
                 contract="Tennis.Service.Contracts.IFamilyAdmin"
                  />
      </service>
    </services>

次に、サービスメソッドには次のものがあります(Roles.Family管理者は文字列です)

[PrincipalPermission(SecurityAction.Demand, Name = Roles.FamilyAdmin)]
public VoidResult<SuccessEnum> UpdateFamily(Family family)
{

}

2 つの質問があります... 1) 私は何を間違えましたか? 2) WCF にアクセスして、何が問題なのかを正確に把握するにはどうすればよいですか?

乾杯

ログのエラーのスタック トレースは次のとおりです。アクセス許可は、上記で使用したものとは異なることに注意してください (Namley は「FamilyAdmin」ではなく「承認済み」です。ただし、実際には、これらの値は一致し、ユーザーは正しい権限。

<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>131076</EventID>
<Type>3</Type>
<SubType Name="Warning">0</SubType>
<Level>4</Level>
<TimeCreated SystemTime="2012-06-29T12:45:30.2469191Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{6e59b4f4-d59b-42eb-ad8e-4d5853f72900}" />
<Execution ProcessName="w3wp" ProcessID="9388" ThreadID="18" />
<Channel />
<Computer>JOHNN-PC</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning">
<TraceIdentifier>http://msdn.microsoft.com/en-GB/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx</TraceIdentifier>
<Description>Handling an exception.</Description>
<AppDomain>/LM/W3SVC/2/ROOT/Tennis-1-129854474506679191</AppDomain>
<Exception>
<ExceptionType>System.Security.SecurityException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>Request for principal permission failed.</Message>
<StackTrace>
at System.Security.Permissions.PrincipalPermission.ThrowSecurityException()
at System.Security.Permissions.PrincipalPermission.Demand()
at System.Security.PermissionSet.DemandNonCAS()
at Nomical.Tennis.Service.Services.GetBookingsForUser(DateTime start, DateTime end) in c:\tfs\Tennis\TennisSolution\TennisCourts\Services.svc.cs:line 388
at SyncInvokeGetBookingsForUser(Object , Object[] , Object[] )
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
</StackTrace>
<ExceptionString>System.Security.SecurityException: Request for principal permission failed.
   at System.Security.Permissions.PrincipalPermission.ThrowSecurityException()
   at System.Security.Permissions.PrincipalPermission.Demand()
   at System.Security.PermissionSet.DemandNonCAS()
   at Tennis.Service.Services.GetBookingsForUser(DateTime start, DateTime end) in c:\tfs\Tennis\TennisSolution\TennisCourts\Services.svc.cs:line 388
   at SyncInvokeGetBookingsForUser(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs)
The action that failed was:
Demand
The type of the first permission that failed was:
System.Security.Permissions.PrincipalPermission
The first permission that failed was:
&lt;IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"&gt;
&lt;Identity Authenticated="true"
ID="Authorised"/&gt;
&lt;/IPermission&gt;

The demand was for:
&lt;IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1"&gt;
&lt;Identity Authenticated="true"
ID="Authorised"/&gt;
&lt;/IPermission&gt;

The assembly or AppDomain that failed was:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionString>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>

編集: 以下の回答に基づいて、コンストラクターに数行のコードを追加しました。これにより、何も達成されませんが、スレッドの静的クラスに問い合わせることができました。

編集:ログについての質問があった場合、それが実際にログからのものであることを示すためにログを更新しました-または私は混乱しています;)

TennisRoleProvider は、その非パブリック メンバーで参照されます。さらに、Name をオーバーライドして何かを返すようにすると、これが返されたことがわかります。

4

2 に答える 2

1

問題は、アセンブリ/アプリ ドメイン全体でセキュリティを使用していることです。

それが機能するためには、すべてを信頼して署名する必要があります。

于 2012-10-08T15:29:45.873 に答える
0

ロール プロバイダーの 1 つにブレーク ポイントを設定します。WCF サービスが自己ホストされている場合は、ホストを開始するか、IIS の下にある場合はその *svc ファイルにアクセスします。Visual Studio から [Debug] に移動し、[Attach to Process] をクリックして、リストから作業プロセスを選択しますこれで、WCF サービス実行プロセスにアタッチできます。最後に、クライアントからサービスのテスト メソッドの 1 つを呼び出して、ブレーク ポイントがヒットするかどうかを確認します。

それでもうまくいかない場合は、サービス レベルでトレースを有効にして、疑わしい情報がないかトレース ログ ファイルを確認してください。

于 2012-06-29T12:38:41.313 に答える