Пользовательский MembershipProvider в .NET 4.0

#asp.net #asp.net-membership #membership-provider

#asp.net #asp.net-членство #поставщик членства

Вопрос:

Здесь, в so, есть несколько тем по этому вопросу, но большинство из них устарели, а ссылки в них еще более устарели.

Я получил этот веб-сайт, который мне нужно подключить к внешнему серверу sql (mssql) с его собственной структурой таблиц, используя значение по умолчанию asp.net структура поставщика членства — это не вариант. Макет таблицы действительно прост, и таблица пользователей выглядит следующим образом (она называется Individuals)

 Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)
  

Необходимая функциональность — просто зарегистрировать кого-либо, остальное не обязательно 🙂

Я следовал некоторым руководствам, но большинство из них устарели и очень сложны. К сожалению, примеры msdn следуют этому шаблону, а документация не очень хороша.

Итак, если у кого-нибудь есть ресурсы, показывающие, как это сделать, или они готовы опубликовать примеры кода или подобное здесь, я был бы признателен.

Спасибо!

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

1. Я много раз искал простого поставщика. И всегда находил что-то слишком сложное. Итак, я решил создать свои собственные всего 5 классов. Смотрите github.com/TesserisPro/ASP.NET-SImple-Security-Provider

Ответ №1:

На самом деле это очень просто:

  1. Создайте новый файл класса (если вы не используете многоуровневую систему, в папке Models вашего проекта), давайте назовем MyMembershipProvider.cs

  2. Наследовать этот класс от System.Web.Security.MembershipProvider

  3. автоматически создавать необходимые методы (точка пробел в наследоваемом классе)

Готово!

Все методы будут иметь NotImplementedException исключение, все, что вам нужно сделать, это отредактировать каждый из них и добавить свой собственный код. Например, я определяю GetUser , как показано ниже:

 public override MembershipUser GetUser(string username, bool userIsOnline)
{
    return db.GetUser(username);
}
  

db является ли мой репозиторий базы данных, который я добавил в класс как

 MyServicesRepository db = new MyServicesRepository();
  

там вы найдете GetUser метод в виде:

 public MembershipUser GetUser(string username)
{
    OS_Users user = this.FindUserByUsername(username);

    if (user == null)
        return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: "",
            providerUserKey: null,
            email: "",
            passwordQuestion: "",
            comment: "",
            isApproved: false,
            isLockedOut: true,
            creationDate: DateTime.UtcNow,
            lastLoginDate: DateTime.UtcNow,
            lastActivityDate: DateTime.UtcNow,
            lastPasswordChangedDate: DateTime.UtcNow,
            lastLockoutDate: DateTime.UtcNow);

    return
        new MembershipUser(
            providerName: "MyMembershipProvider",
            name: user.username,
            providerUserKey: null,
            email: user.email,
            passwordQuestion: "",
            comment: "ANYTHING you would like to pass",
            isApproved: true,
            isLockedOut: user.lockout,
            creationDate: user.create_date,
            lastLoginDate: user.lastLoginDate,
            lastActivityDate: user.lastActivityDate,
            lastPasswordChangedDate: user.lastPasswordChangedDate,
            lastLockoutDate: user.lastLockoutDate);
}
  

Сделайте это для всех методов, которые вы используете (отладьте проект и посмотрите, какие из них вам нужны) — я использую только некоторые, а не все, поскольку мне на самом деле наплевать на такие методы, как ChangePasswordQuestionAndAnswer , DeleteUser и т. Д

просто убедитесь, что в вашем web.config вы добавляете новое членство как:

 <membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear/>
    <add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>
  

У вас есть хороший видеоурок от Криса Пелса (датированный 2007 годом, но все еще в основном действующий), а также код для этого, хотя видеоурок на VB, но давайте разберемся с шагами…

http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

Я не только создал своего собственного поставщика членства, но я также создал своего поставщика ролей, который, как вы можете видеть из приведенного выше кода, так же прост, как и членство, и позволяет вам в вашем приложении использовать такие вещи, как:

 [Authorize(Roles = "Partner, Admin")]
public ActionResult MyAction()
{

}
  

и

 @if (Roles.IsUserInRole(Context.User.Identity.Name, "Admin"))
{
    <div>You're an ADMIN, Congrats!</div>
}
  

Что такое автоматическое создание необходимых методов (точка пробел в наследоваемом классе)

Вы можете либо щелкнуть правой кнопкой мыши, либо навести курсор на имя и нажать Control ., а затем space.

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

1. Спасибо, мне все еще нужно устанавливать схемы aspnet (те, которые используются поставщиком членства) и другие материалы в мою удаленную базу данных?

2. Нет … класс не имеет подключения к схеме базы данных, вы это реализуете. Например, я попросил мою собственную базу данных / мои собственные таблицы OS_Users в моем примере предоставить мне пользователя, и пока вы передаете MembershipUser , все в порядке. —> Сначала посмотрите видеоролик, который я опубликовал в ответе, чтобы вы поняли, о чем идет речь.

3. @Michael С опозданием на несколько месяцев, но поскольку я только вчера сам это понял, решил поделиться: вы можете «автоматически» создать методы и свойства, которые должны быть унаследованы, щелкнув правой кнопкой мыши «MembershipProvider» в заголовке вашего класса (общедоступный класс MyMembershipProvider : MembershipProvider) — будет возможность генерировать заглушки для необходимого унаследованного материала. Все заглушки автоматически заполняются NotImplementedExceptions(), которые вы можете либо оставить таким образом, либо удалить и внедрить при необходимости.

4. вместо щелчка правой кнопкой мыши вы можете навести курсор на имя и нажать Control . , а затем space .

5. Кстати, для этого требуется ссылка на System.Web.ApplicationServices.dll

Ответ №2:

Здесь, в so, есть несколько тем по этому вопросу, но большинство из них устарели, а ссылки в них еще более устарели.

С момента появления ASP.NET в Framework 1.0 страница.User /CurrentSession.Модель User / IPrincipal / IIdentity не изменилась. В Framework 2.0 был добавлен поставщик членства. Эти «устаревшие» ссылки остаются действительным руководством. MSDN