Использование одной базы данных членства Asp.net с несколькими приложениями Single Sign On - PullRequest
20 голосов
/ 16 февраля 2010

У меня есть два приложения asp.net на одном сервере IIS, и я хотел бы использовать одну и ту же внутреннюю базу данных asp_security и поставщика членства. Я прочитал, что все, что мне нужно сделать, это указать одно и то же имя приложения в обеих веб-конфигурациях, как я делаю сейчас, но я, должно быть, делаю что-то не так

В каждом приложении 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="membership"
              enablePasswordRetrieval="false"
              enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              applicationName="/"
              requiresUniqueEmail="false"
              minRequiredPasswordLength="5"
              minRequiredNonalphanumericCharacters="0"
              passwordFormat="Hashed"
              maxInvalidPasswordAttempts="5"
              passwordAttemptWindow="10"
              passwordStrengthRegularExpression=""
              />
  </providers>
</membership>

Когда я вхожу из приложения A и перехожу к приложению B, приложение B, кажется, ничего не знает обо мне или моих учетных данных из приложения A. У кого-нибудь есть идеи, что я делаю неправильно?

Ответы [ 2 ]

21 голосов
/ 17 февраля 2010

Просто для завершения я отвечу, как я достиг цели, о которой хотел спросить мой первоначальный вопрос.

У меня было два приложения asp.net на одном сервере IIS. Моей целью было сделать так, чтобы при входе пользователя в app1 его учетные данные были доступны в app2. Настройка поставщика членства asp.net - это только один шаг из того, что я искал. Даже если бы оба приложения использовали одну и ту же внутреннюю базу данных и провайдера, я все равно не прошел бы аутентификацию, когда нажал app2. То, что я искал, было решением единого входа.

После того, как оба приложения указывают на вашу базу данных asp_membership, поместите в раздел system.web вашей веб-конфигурации следующее:

<authentication mode="Forms" />
<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              applicationName="/"
              />
  </providers>
</membership>
<roleManager enabled="true" />

убедитесь, что оба свойства имеют одинаковое имя приложения.

Я использовал IIS 6, поэтому настроил его для автоматической генерации ключа компьютера для обоих приложений. Поскольку оба этих приложения находятся на одной и той же машине, ключ будет одинаковым, это критически важная часть работы единого входа. После настройки IIS в мой web.config

было добавлено следующее
    <machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />

Это было все, что нужно было. Как только это было сделано, я мог войти в app1, а затем перейти к app2 и сохранить свои учетные данные безопасности.

Спасибо за толчок в правильном направлении.

2 голосов
/ 16 февраля 2010

Если мое понимание мне подходит, учетные данные аутентификации пользователей хранятся в контексте HTTP каждого приложения. Таким образом, переключение между двумя приложениями не приведет к автоматической аутентификации пользователя, поскольку при переключении на приложение B будет создан новый контекст.

Я считаю, что правильным подходом было бы использование DefaultCredentials (или свойства UseDefaultCredentials для True) текущего пользователя до перехода на приложение B.

Когда вы говорите, переключитесь, что вы имеете в виду, например. открыть другое окно браузера и получить доступ к приложению B или запросить страницу у appB у appA?

...