ASP.net членство провайдер - переключение между формами и встроенной аутентификации - PullRequest
2 голосов
/ 15 сентября 2008

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

В настоящее время я использую код:

public static string UserID
{
  get
  {
     if (HttpContext.Current.User.Identity.AuthenticationType == "Forms")
     {
       //using database auth
       return Membership.GetUser().ProviderUserKey.ToString();
     }
     else
     {
       //using integrated auth
       return HttpContext.Current.Request.LogonUserIdentity.User.ToString();
     }
   }
 }

Затем я использую возвращенный ключ (в зависимости от провайдера это UserID из базы данных aspnetdb или Windows SID) в качестве UserID для создаваемых ими элементов и т. Д. Поля UserID не связаны с таблицей Users база данных, как вы обычно делаете.

Есть ли лучший способ сделать это? Я думал о создании таблицы пользователей с двумя полями UserID (внутреннее) и ExternalID (в котором хранится SID Windows или ID из aspnetdb), а затем с использованием внутреннего UserID во всем приложении, но тогда это не так чисто с членством занятия в с #.

Кажется, что есть много приложений, которые позволяют вам переключаться между встроенной аутентификацией и FBA (сначала приходит в голову Sharepoint 2007), но я не смог найти в Интернете хороших руководств по разработке решения. Любая помощь будет принята с благодарностью. Благодаря.

1 Ответ

1 голос
/ 16 сентября 2008

Почему бы просто не использовать двух разных провайдеров членства (Windows и Forms, вместо того, чтобы использовать LogonUserIdentify специально)? В приведенном вами примере кода вы можете использовать один и тот же метод в пространстве имен Membership для любого поставщика. Вы можете изменить, какой поставщик является по умолчанию в файле Web.config. Я согласен, что использование кода, специфичного для «интегрированной аутентификации», не является чистым. Вот пример:

<membership defaultProvider="1">
 <providers>
  <clear/>
  <add name="1" ... />
  <add name="2" ... />
 </providers>
</membership>

Затем измените defaultProvider. Элементы управления ASP.NET, относящиеся к членству (например, элемент управления входом в систему), имеют свойство, позволяющее выбрать поставщика членства, что означает, что вы можете выбрать одного из них программно.

Идентификатор пользователя имеет значение только в контексте провайдера, поэтому использование «внутреннего» имени пользователя кажется ненужным - используйте имя провайдера и внешний идентификатор пользователя (поскольку один и тот же идентификатор пользователя может существовать в нескольких провайдерах ) в вашем собственном хранилище данных.

Обычно нет необходимости создавать свои собственные идентификаторы пользователей, поскольку провайдеры ASP.NET позаботятся об этом за кулисами. Например, если вы используете поставщика профилей ASP.NET, у вас будет информация о профиле пользователя, независимо от того, какой поставщик членства использовался для аутентификации пользователя.

...