У меня есть пользовательский поставщик роли, который наследует от 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[]& 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[]& 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:
<IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1">
<Identity Authenticated="true"
ID="Authorised"/>
</IPermission>
The demand was for:
<IPermission class="System.Security.Permissions.PrincipalPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
version="1">
<Identity Authenticated="true"
ID="Authorised"/>
</IPermission>
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 ссылаются ею в своих непубличных членах - более того, когда я отменяю имя, чтобы сделать он возвращает что-то, что я признаю, что это было возвращено им.
Вы использовали сконфигурированную трассировку WCF и использовали средство просмотра трассировки службы (http://msdn.microsoft.com/en-us/library/ms732023.aspx)? Он обычно дает ценную информацию. –
Да, именно здесь происходит подробная ошибка. Я не получаю ничего полезного из непосредственного исключения из wcf. Они важны: D –
Это может быть ничего, но я заметил, что в вашем web.config под 'behavior -> serviceCredentials -> serviceCertificate'' findValue = "john-pc" ', но отчеты о трассировке стека' JOHNN-PC ' , Может ли это быть ошибкой сертификата из-за несоответствия имени компьютера? –
Infotekka