Могу ли я выполнить простую диагностику, чтобы определить, почему аутентификация не работает с поставщиком ClientFormsAuthenticationMembershipProvider? Моя проблема:
У меня есть веб-сайт (назовем его веб-сайт «Аутентификатор»), размещенный на сервере А, который настроен на использование поставщика AspNetSqlMembershipProvider для управления как членством, так и управлением ролями. Вот (что я думаю) соответствующие ключи web.config для этого веб-сайта:
<membership>
<providers>
<clear />
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="MMMS35.API"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="Moose"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="1"
passwordStrengthRegularExpression="" />
</providers>
</membership>
<profile>
<providers>
<clear />
<add name="AspNetSqlProfileProvider"
connectionStringName="MMMS35.API"
applicationName="Moose"
type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</profile>
<roleManager enabled="true">
<providers>
<clear />
<add name="AspNetSqlRoleProvider"
connectionStringName="MMMS35.API"
applicationName="Moose"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
У меня есть другой веб-сайт (называемый веб-сайтом «Тестовый клиент»), размещенный на сервере B в той же сети, что и сервер A, но я не знаю, какие сетевые пути, конфигурация маршрутизатора и т. Д. Находятся между серверами A & B. Тестовый клиент имеет фиктивную настройку входа в систему, которая использует провайдер ClientFormsAuthenticationMembershipProvider, чтобы запросить у веб-сайта «Аутентификатор» аутентификацию учетных данных, указанных на Тестовом клиенте. Соответствующие разделы тестового клиента web.config:
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<clear/>
<add name="ClientAuthenticationMembershipProvider"
type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
serviceUri="http://slmooseapp1/mia/Authentication_JSON_AppService.axd"
credentialsProvider=""
savePasswordHashLocally="False"/>
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<clear/>
<add name="ClientRoleProvider"
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
serviceUri="http://slmooseapp1/mia/Role_JSON_AppService.axd"
cacheTimeout="1"/>
</providers>
</roleManager>
Когда Test Client выполняет эту строку:
DirectCast(Membership.Provider, ClientServices.Providers.ClientFormsAuthenticationMembershipProvider).ValidateUser(UserName.Text, Password.Text)
Я получаю исключение:
System.UnauthorizedAccessException: Access to the path 'C:\Documents and Settings\Default User\Application Data\Microsoft Corporation\Internet Information Services\6.0.3790.3959' is denied.
Тем не менее, когда я запускаю Test Client на моем компьютере для разработки (не на сервере B) с теми же путями web.config serviceUri (т. Е. Мой поставщик членства в клиенте указывает на тот же веб-сайт аутентификации на сервере A), проверка пользователя и получение ролей для этого пользователя работает отлично.
Если я открою браузер на сервере B и запросю страницу с веб-сайта аутентификации, веб-приложение аутентификации будет работать нормально, поэтому я знаю, что могу успешно выполнить http-запросы с сервера B на сервер A. Что происходит с ClientFormsAuthenticationMembershipProvider, который завершается неудачно, когда он пытается выполнить (как мне кажется,) запрос JSON с сервера B на сервер A?
РЕДАКТИРОВАТЬ (21.09.2009):
Я попробовал этот сценарий сейчас с веб-сайтом аутентификации и тестовым клиентом на одном компьютере (который не является моей машиной для разработки). Это все еще не удается. Я написал необработанный Http-запрос программно и получил успешный ответ ...
Запрос:
Content-Type: application/json
Host: slappdev
Content-Length: 70
Expect: 100-continue
Connection: Keep-Alive
{"userName":"mdh","password":"test123","createPersistentCookie":false}
Ответ:
MicrosoftOfficeWebServer: 5.0_Pub
Content-Length: 10
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Date: Mon, 21 Sep 2009 20:10:13 GMT
Set-Cookie: AppName=1756811D52C4619AC78...; path=/; HttpOnly
Server: Microsoft-IIS/6.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
{"d":true}
Итак, я предполагаю, что что-то не так при работе через вызовы .Net Framework, чтобы добраться от ValidateUser к реальному HTTP-запросу. Есть идеи?
Редактировать (22.09.2009) :
Исключение - это то же исключение, что и при попытке моей веб-страницы тестового клиента получить доступ к System.Windows.Forms.Application.UserAppDataPath. Добавление атрибута connectionStringName к ключу членства / поставщиков / добавления, который указывает на допустимое имя строки подключения в файле web.config в клиентском веб-приложении, изменяет исключение!
System.Data.SqlClient.SqlException: Invalid object name 'ApplicationProperties'. at System.Data.SqlClient.SqlConnection.OnError
Итак, если все функции членства используют serviceUri, почему что-то предпринимается локально на клиенте? И какую утилиту мне нужно запустить, чтобы добавить эти новые таблицы / объекты в мою базу данных для поддержки поставщика членства клиента?