Что не так с моим запросом на членство в ValidateUser? (используя ClientFormsAuthenticationMembershipProvider) - PullRequest
2 голосов
/ 28 августа 2009

Могу ли я выполнить простую диагностику, чтобы определить, почему аутентификация не работает с поставщиком 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, почему что-то предпринимается локально на клиенте? И какую утилиту мне нужно запустить, чтобы добавить эти новые таблицы / объекты в мою базу данных для поддержки поставщика членства клиента?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

ClientAuthenticationMembershipProvider имеет функцию автономного кэширования. В случае, если фактический поставщик членства не может быть достигнут, поставщик членства клиента может кэшировать учетные данные на клиентском компьютере и использовать эти автономные учетные данные. Этот автономный кэш представлен файлом базы данных SQL Server Compact Edition, который автоматически создается и хранится в расположении System.Windows.Forms.Application.UserAppDataPath.

Согласно этой статье MSDN , вы можете настроить локальный автономный кеш для использования базы данных. Вы должны вручную создать таблицы базы данных, как указано в статье (в моем редакторе 9/22 я еще не создавал эти таблицы, и никакой утилиты для этого нет). Я сделал это, но клиент все еще хотел создать структуру папок на локальном компьютере для локального файла SQL CE, даже если он никогда не будет создавать такой файл. Для каждой машины в моем тесте, КРОМЕ моей локальной рабочей станции, у пользователя IIS не было доступа к созданию структуры этой папки для базы данных локального кэша, которая генерировала исключение UnauthorizedAccessException.

Я довольно недоволен тем, что A) нет ключа конфигурации для отключения автономного кэша для членства, и B) даже при направлении автономного кэша в базу данных, поставщик членства клиента все еще должен создать путь к папке файл локального кэша, который он никогда не создает.

0 голосов
/ 16 сентября 2009

Если вы добавите тег system.diagnostic в файл web.config, он будет работать. (Я получаю здесь только пустой файл, но также не сообщение об ошибке.)

 <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="myListener"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
          <add    name="myListener"
                       type="System.Diagnostics.TextWriterTraceListener"
                       initializeData="c:\temp\MyFile.log" />
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
...