#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:
На самом деле это очень просто:
-
Создайте новый файл класса (если вы не используете многоуровневую систему, в папке 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
Я не только создал своего собственного поставщика членства, но я также создал своего поставщика ролей, который, как вы можете видеть из приведенного выше кода, так же прост, как и членство, и позволяет вам в вашем приложении использовать такие вещи, как:
[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