Загадочное исключение «Доступ запрещен» из службы WCF - PullRequest
1 голос
/ 04 июля 2010

У меня есть безопасный сервис WCF с пользовательской аутентификацией. Когда я выполняю стресс-тестирование - при одновременном подключении нескольких десятков клиентов я часто получаю следующее исключение в своих журналах на стороне сервера:

System.ServiceModel.FaultException: Access is denied.
   at System.ServiceModel.Dispatcher.AuthorizationBehavior.Authorize(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Я включил трассировку через System.Diagnostics, но это только дало мне более длинную трассировку стека:

System.ServiceModel.Dispatcher.AuthorizationBehavior.Authorize(MessageRpc& rpc)
System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
System.ServiceModel.Dispatcher.ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
System.ServiceModel.Dispatcher.ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump(IAsyncResult result)
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()
System.Security.SecurityContext.Run(SecurityContext securityContext, ContextCallback callback, Object state)
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object state)
System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
System.Threading._IOCompletionCallback.PerformIOCompletionCallback

Почему это происходит и как я могу узнать больше о том, что здесь происходит не так?

Спасибо, Urig

Ответы [ 2 ]

3 голосов
/ 05 июля 2010

Все еще не решена проблема, но я уверен, что это действительно в моем собственном механизме аутентификации - так что я принимаю ответ Хенка.

Для меня пистолет для курения был найден, когда я добавил диагностику для System.IdentityModel примерно так:

<system.diagnostics>
        <sources>
            <source name="System.IdentityModel" switchValue="All">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="IdentityModelListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="C:\Tracing\App_identitymodellog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
             name="IdentityModelListener" traceOutputOptions="Timestamp, Callstack">
                <filter type="" />
            </add>
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>

и в полученных следах увидел это:

System.Environment.get_StackTrace) System.Diagnostics.TraceEventCache.get_Callstack () System.Diagnostics.XmlWriterTraceListener.WriteFooter (TraceEventCache eventCache) System.Diagnostics.TraceSource.TraceData (TraceEventType типСобытия, Int32 идентификатор, данные объекта) System.ServiceModel.Diagnostics (.DiagnosticTrace.TraceEvent (тип TraceEventType, код TraceCode, описание строки, трассировка TraceRecord, исключительная ситуация, источник объекта)IList`1 authorizationPolicies) System.ServiceModel.ServiceSecurityContext.get_AuthorizationContext () Foo.Bar..Core.Security.SessionAuthorizationManager.CheckClaimSet (OperationContext operationContext) в... Foo.Bar..Core.Security.SessionAuthorizationManager.CheckAccess (OperationContext operationContext, Message & message) в ... > System.ServiceModel.Dispatcher.AuthorizationBehavior.Authorize (MessageRpc & rpc) System.Service.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & rpc) System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet) System.ServiceModel.Dispatcher.ChannelHandler.(запрос RequestContext, OperationContext currentOperationContext) System.ServiceModel.Dispatcher.ChannelHandler.AsyncMessagePump (IAsyncResult результат) System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2 () System.Security.SecurityContext.Run (SecurityContext SecurityContext, ContextCallback обратного вызова, объектсостояние) System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke () System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks () System.ServiceModel.Channel.s.errorCode, UInt32 numBytes, NativeOverlapped * nativeOverlapped) System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame (ошибка UInt32, UInt32 bytesRead, NativeOverlapped * nativeOverlaped1011 *

Следующий вызов после Dispatcher.AuthorizationBehavior.Authorize () относится к моей собственной реализации AuthorizationManager.Это, скорее всего, откуда проблема.Метод Authorize () просто выбрасывает FaultException в результате.

2 голосов
/ 04 июля 2010

Из «пользовательских аутентификаций» и «[когда] одновременно подключаются несколько десятков клиентов», я бы предположил, что ваша пользовательская аутентификация (из трассировки стека: часть авторизации) не полностью поточно-ориентирована.Может случиться так, что любая ошибка в части авторизации (неправильно) диагностируется как ошибка «Отказано в доступе».

В свойствах InnerException может содержаться дополнительная информация.Но в противном случае, возможно, вы сможете опубликовать некоторые детали вашего собственного кода авторизации.

...