2012-06-29 8 views
0

У меня есть пользовательский поставщик роли, который наследует от RoleProvider. В веб-приложении это прекрасно работает без проблем.WCF: Пользовательский RoleProvider с PrincipalPermissions: Кажется, не попадает/как его отлаживать?

Однако я также использую его в службе 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> 

EDIT: на основании ответа ниже я добавил несколько строк кода в конструктор - который в то время как они ничего не достигают поощряли меня допрашивать. статический класс резьбы.

EDIT: данный вопрос о журналах обновляются журнал, чтобы показать, что это действительно из журнала - или я запутался;)

TennisRoleProvider ссылаются ею в своих непубличных членах - более того, когда я отменяю имя, чтобы сделать он возвращает что-то, что я признаю, что это было возвращено им.

+0

Вы использовали сконфигурированную трассировку WCF и использовали средство просмотра трассировки службы (http://msdn.microsoft.com/en-us/library/ms732023.aspx)? Он обычно дает ценную информацию. –

+0

Да, именно здесь происходит подробная ошибка. Я не получаю ничего полезного из непосредственного исключения из wcf. Они важны: D –

+0

Это может быть ничего, но я заметил, что в вашем web.config под 'behavior -> serviceCredentials -> serviceCertificate'' findValue = "john-pc" ', но отчеты о трассировке стека' JOHNN-PC ' , Может ли это быть ошибкой сертификата из-за несоответствия имени компьютера? – Infotekka

ответ

1

Проблема заключалась в том, что я использую безопасность в рамках узлов/приложений.

Мне нужно сделать все доверенным и подписано для его работы.

0

Поместите точку останова в одном из поставщиков ролей. Если вы используете службу WCF самостоятельно, запустите хост, или если у вас есть его в IIS, просто войдите в его файл * svc. Из visual studio перейдите в Debug, нажмите «Присоединить к процессу» и выберите свой рабочий процесс из списка w3wp.exe (если вы не можете его увидеть, установите оба флажка «Показывать процессы от всех пользователей» и «Показывать процессы во всех сеансы ». Теперь вы можете подключиться к процессу выполнения службы WCF. Последнее, что нужно сделать, от вашего клиента просто вызвать один из методов тестирования вашей службы и посмотреть, попадает ли ваша точка останова.

Если это не так, t, а затем просто включите отслеживание на уровне своей службы и проверьте файлы журнала трассировки на предмет наличия подозрительной информации.

+0

oh lol ... не думал приложить к процессу:/... последний бит кода в моем вопросе - это все, что я могу почерпнуть из файлов журнала. –

+0

Значит, вы сделали это или нет? –

+0

хорошо, я и не могу поразить точки останова, которых я боюсь. Как только я вызываю метод на службе, он терпит неудачу с ошибкой mainPermission (и это действительно похоже на то, что мой код работает на что-то (контекст/поток), я не могу отлаживать или его вообще не ударять) –

 Смежные вопросы

  • Нет связанных вопросов^_^