Я создал приложение с Silverlight4, службами RIA и использую членство в ASP.NET для аутентификации / авторизации.
Мой web.config имеет следующее:
<system.web>
<sessionState timeout="20"/>
<authentication mode="Forms">
<forms name="_ASPXAUTH" timeout="20"/>
</authentication>
Я прочитал несколько различных стратегий о том, как бороться с тайм-аутом аутентификации / сеанса на стороне клиента.То есть: если клиент простаивает в течение x минут (20 здесь), а затем он что-то делает с пользовательским интерфейсом, который запускает вызов RIA / WCF, я хочу перехватить это событие и обработать его соответствующим образом (например, вернуть его обратно вэкран входа в систему) - в двух словах: мне нужен способ отличить добросовестную серверную сторону DomainException от ошибки аутентификации, поскольку время сеанса истекло.
AFAIK: нет типизированного исключения или свойства, котороемогу определить это.Единственный способ, которым я смог определить это - что похоже на взлом: проверить строку сообщения об ошибке и найти что-то вроде «Отказано в доступе» или «отказано».Например: что-то вроде этого:
if (ex.Message.Contains("denied"))
// this is probably an auth failure b/c of a session timeout
Итак, это то, чем я сейчас занимаюсь, и оно работает, если я запускаю и отлаживаю либо со встроенного сервера VS2010, либо если я запускаю вlocalhost IIS.Если я установлю тайм-аут на 1 минуту, войду в систему, подожду больше минуты и вызову другой вызов, я остановлю точку останова на исключении и введу приведенный выше блок кода, и все хорошо.
Затем я разверну приложениеудаленный сервер IIS7, и я пробую тот же тест, и он не работает.Итак, я добавил трассировку журнала, и вот событие, где произошло исключение:
<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="Error">0</SubType>
<Level>2</Level>
<TimeCreated SystemTime="2011-10-30T22:13:54.6425781Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{20c26991-372f-430f-913b-1b72a261863d}" />
<Execution ProcessName="w3wp" ProcessID="4316" ThreadID="24" />
<Channel />
<Computer>TESTPROD-HOST</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx</TraceIdentifier>
<Description>Handling an exception.</Description>
<AppDomain>/LM/W3SVC/1/ROOT/sla-2-129644844652558594</AppDomain>
<Exception>
<ExceptionType>System.ServiceModel.FaultException`1[[System.ServiceModel.DomainServices.Hosting.DomainServiceFault, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message></Message>
<StackTrace>
at System.ServiceModel.DomainServices.Hosting.QueryOperationBehavior`1.QueryOperationInvoker.InvokeCore(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.DomainServices.Hosting.DomainOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
<ExceptionString>System.ServiceModel.FaultException`1[System.ServiceModel.DomainServices.Hosting.DomainServiceFault]: (Fault Detail is equal to System.ServiceModel.DomainServices.Hosting.DomainServiceFault).</ExceptionString>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
Проблема в том, что у меня нет строки в сообщении об ошибке, которая указывает «отказано» или «Доступ запрещен»- и я не уверен, почему это решение работает на локальном хосте IIS или VS2010, а не на удаленном сервере IIS7.Есть какие-то неясные настройки конфигурации, которые мне здесь не хватает?Есть ли лучший способ сделать это в целом?