Пользовательский MembershipProvider в.NET 4.0
Здесь есть несколько тем по этому вопросу, но большинство из них устарели, а ссылки в них еще более устаревшие.
Я получил этот веб-сайт, который мне нужно подключить к внешнему серверу sql (mssql) с его собственной структурой таблиц, использование структуры поставщика членства asp.net по умолчанию не вариант. Таблица очень проста, и пользовательский интерфейс выглядит так (он называется "Индивидуальные")
Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)
Требуемый функционал - просто войти в систему, остальное не нужно:)
Я следовал некоторым руководствам, но большинство из них устарели и очень сложны. К сожалению, примеры MSDN следуют этому шаблону, и документация не очень хорошая.
Так что, если у кого-то есть какие-то ресурсы, показывающие, как это сделать, или они хотят опубликовать здесь примеры кода или подобное, я был бы признателен.
Спасибо!
2 ответа
Это действительно очень просто:
Создайте новый файл Class (если вы не используете многослойную систему в папке Models вашего проекта)
MyMembershipProvider.cs
Унаследовать этот класс от
System.Web.Security.MembershipProvider
автоматически создавать необходимые методы (точка + пробел в наследуемом классе)
Готово!
Все методы будут иметь 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 + . а потом космос.
Здесь есть несколько тем по этому вопросу, но большинство из них устарели, а ссылки в них еще более устаревшие.
С момента появления ASP.NET в Framework 1.0 модель Page.User/CurrentSession.User/IPrincipal/IIdentity не изменилась. В Framework 2.0 был добавлен поставщик членства. Эти "устаревшие" ссылки остаются действительным руководством. MSDN