Как мне связать данные моего приложения с пользователем в ASP.NET MembershipProvider?

#asp.net-mvc #asp.net-membership #sqlmembershipprovider

#asp.net-mvc #asp.net-членство #sqlmembershipprovider

Вопрос:

Я только начинаю изучать ASP.NET MVC. Я работаю над проектом, созданным с помощью стандартного шаблона проекта, который по умолчанию использует SqlMembershipProvider . Это автоматически создало базу данных ASPNETDB.mdf в моем проекте для хранения информации о членстве. Как я могу связать элементы, хранящиеся в этой базе данных, с моими фактическими данными приложения?

Должен ли я просто ссылаться на имя текущего пользователя в моих методах действий с помощью this.User.Identity.Name для использования в качестве ключа при сохранении или извлечении специфичной для пользователя информации в базу данных моего приложения и из нее? Или я должен использовать this.User.Identity.UserId вместо этого? Я всегда думал, что идентификаторы на основе целых чисел намного быстрее искать, чем идентификаторы на основе строк или GUID. Но первичным ключом таблицы aspnet_Users является поле GUID.

Есть ли какая-либо разница между this.user vs this.HttpContext.User ? Как насчет IPrincipal возвращаемых из этих свойств по сравнению с MembershipUser возвращаемыми из Membership.GetUser() . В чем разница между ними?

Кроме того, лучше ли хранить информацию о членстве в отдельной базе данных от базы данных приложения? Или можно объединить их вместе в единую базу данных?

Ответ №1:

В вашем вопросе есть несколько элементов, несколько моментов:

Обычно я использую идентификационное имя, поскольку оно обычно более эффективно в использовании. Функция get user получает полные пользовательские данные из базы данных и обновляет время последнего доступа. IPrinciple не требует этого и использует данные в памяти. Таким образом, свойство username быстрее и более доступно. Основным предостережением было бы, если бы вы могли разрешить пользователям изменять свое имя пользователя, в этом случае идентификатор имел бы больше смысла.

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

Что касается этого.Пользователь vs HttpContext.User, никакой разницы.

Комментарии:

1. Нет, это мой первый ASP.NET приложение когда-либо. Таким образом, у меня вообще не будет много пользователей. Я уверен, что было бы неплохо просмотреть их по имени пользователя или userId. Я просто пытаюсь понять, как это должно работать. Спасибо!

Ответ №2:

Шаблон по умолчанию должен предоставлять вам «AccountModel» в папке Models, которая создает оболочки для некоторых функций formsauthentication / membership membership. вы можете расширить это и добавить функцию для возврата текущего «HttpContext.Current.User», который является IP-исходным элементом, хранящимся в текущем HttpContext. С помощью свойства Name, из которого вы могли бы запрашивать членство по имени пользователя, чтобы получить данные о членстве (IPrincipal хранит только самые основы, такие как имя пользователя, роли и т.д. У MembershipUser есть все остальные данные, извлеченные из базы данных).

SqlMembershipProvider довольно дерьмовый imo и ограничивает возможности, отличные от небольших проектов…и в то же время это довольно сложно. Сейчас я использую его на сайте с более чем 2000 учетными записями, и это pita, если вы хотите что-то настроить. Лучше (и в сети есть много примеров) просто написать свой собственный, который использует formsauthentication и избавиться от ненужного членства. Теперь у меня есть один, и я хотел бы написать его для начала.

Комментарии:

1. При всем должном уважении, я не согласен. Я использовал поставщика членства для сайтов с очень высокой нагрузкой. Если у вас возникли проблемы с несколькими пользователями, я бы сказал, что у вас какие-то проблемы с вашими серверами. Весь смысл поставщика членства в том, чтобы помочь вам не выполнять повторяющиеся задачи, подобные этой, самостоятельно и выполнить первый этап разработки. Если вы хотите расширить его, это тоже очень просто…

2. Что ж, классы AccountMembershipService и FormsAuthenticationService, созданные по умолчанию в AccountModel.cs, действительно переносят функциональность только в классы MembershipProvider и FormsAuthentication соответственно. Итак, я пытаюсь понять, что на самом деле происходит за кулисами. Это мой первый ASP.NET проект ever so Меня не слишком беспокоят какие-либо ограничения SqlMembershipProvider. Будет ли Http.Context. Пользователь всегда ссылается на того же пользователя, что и MemberShip.getUser()?

Ответ №3:

В приложениях, где я использовал SqlMembershipProvider, я обычно сохранял его таблицы / sprocs в той же базе данных, что и таблицы моего приложения, а затем связывал таблицы моего приложения с таблицами пользователя с помощью внешнего ключа. Единственный раз, когда я не сделал этого таким образом, был, когда одна база данных пользователя должна была использоваться совместно несколькими различными приложениями, у каждого из которых была своя база данных приложений.

Комментарии:

1. Меня беспокоило то, что если я начну создавать связи с таблицами SqlMembershipProvider, я могу в конечном итоге что-то сломать. При настройке Fk вы также установили правило удаления или обновления, чтобы при удалении пользователя удалялась и вся связанная информация приложения?