Пользовательский MembershipProvider в .NET 4.0 - PullRequest
40 голосов
/ 18 апреля 2011

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

У меня есть этот сайт, который мне нужно подключить к внешнему SQLсервер (mssql) со своей собственной структурой таблиц, использование структуры поставщика членства asp.net по умолчанию не вариант.Расположение таблицы действительно простое, и пользовательский интерфейс выглядит следующим образом (он называется «Персоны»)

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

Необходимая функциональность - просто войти в систему, остальное не нужно:)

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

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

Спасибо!

Ответы [ 2 ]

62 голосов
/ 18 апреля 2011

Это действительно очень просто:

  1. Создайте новый файл Class (если вы не используете многослойную систему в папке 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

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

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

}

и

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

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

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

0 голосов
/ 18 апреля 2011

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

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

...