Какая минимальная реализация провайдера ASP.NET мне нужна для аутентификации и авторизации пользователя?
По умолчанию ASP.NET MVC настраивает AccountController для использования SqlMembershipProvider, SqlProfileProvider и SqlRoleProvider. На самом деле мне не нужно все, что приносит на стол, на самом деле, это больше хлопот, чтобы сформировать мои данные в эту модель.
Какой минимум мне нужно реализовать для абстрактных классов MembershipProvider, RoleProvider и ProfileProvider, чтобы получить аутентификацию и авторизацию, а не сломать какую-то другую зависимость, которая может там быть?
Например, в ProfileProvider он хочет, чтобы я переопределил метод "FindInactiveProfilesByUserName", но мне не особо важна эта функция. Где произойдет сбой моего приложения при срабатывании NotImplementedException?
Кроме того, например, для MembershipProvider мне не нужен метод FindUsersByEmail. Если я не осуществлю это, ASP.NET MVC задохнется в какой-то момент? Если так, то где?
3 ответа
Насколько я знаю, ASP.NET MVC ничего не делает для вас в отношении аутентификации. Имея это в виду, как говорит @chrispr, вам нужно всего лишь реализовать ValidateUser
и проект, созданный шаблоном проекта ASP.NET MVC, вызывает этот метод только во время аутентификации.
Что касается авторизации, я посмотрел на AuthorizationAttribute
в Reflector и обнаружил, что он вызывает IPrincipal.IsInRole
, Смотря на System.Web.Security.RolePrincipal
в отражателе, IsInRole
звонки GetRolesForUser
, так что вы можете попробовать реализовать только этот метод для начала.
Я реализовал настраиваемые поставщики по тем же причинам (мне не нравится схема, используемая поставщиками sql), но я решил не реализовывать настраиваемый поставщик профилей, так как он, кажется, полагается на параметры конфигурации для свойств профиля, и я не хотел чтобы пойти по этому пути (см. Обзор свойств профиля ASP.NET).
В качестве примечания я обнаружил, что, глядя на SqlMembershipProvider
а также SqlRoleProvider
в Reflector было полезно, когда я реализовал свои собственные провайдеры, поэтому вы можете захотеть сделать то же самое.
Я полагаю, что вам нужно реализовать ValidateUser только на MembershipProvider, чтобы воспользоваться функциями аутентификации MembershipProvider. Остальные функции вызываются с помощью предоставленных веб-элементов управления, таких как CreateUserWizard, поэтому при их использовании обязательно отключите все неподдерживаемые функции этих элементов управления. Что касается остальных (RoleProvider и ProfileProvider), если вы не используете какие-либо функции, связанные с ролями пользователей или профилями пользователей, вам не нужно реализовывать ни одного из участников.
Вот что у меня есть в моих пользовательских провайдерах:
namespace MyProject
{
public class SqlMembershipProvider : System.Web.Security.SqlMembershipProvider
{
private string ConnectionString { get; set; }
public override bool ChangePassword(string userName, string oldPassword, string newPassword)
{
//
}
public overrideMembershipUser CreateUser(string userName, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
//
}
private MembershipUser CreateUser(string userName, string password, object providerUserKey, out MembershipCreateStatus status)
{
//
}
public override bool DeleteUser(string userName, bool deleteAllRelatedData)
{
//
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
this.ConnectionString = ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString;
base.Initialize(name, config);
}
public override MembershipUser GetUser(string userName, bool userIsOnline)
{
//
}
public override bool ValidateUser(string userName, string password)
{
//
}
}
}
а также:
namespace MyProject
{
public class SqlRoleProvider : System.Web.Security.RoleProvider
{
private string ConnectionString { get; set; }
public override void AddUsersToRoles(string[] userNames, string[] roleNames)
{
//
}
public override string ApplicationName
{
get
{
throw new NotSupportedException();
}
set
{
throw new NotSupportedException();
}
}
public override void CreateRole(string roleName)
{
throw new NotSupportedException();
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotSupportedException();
}
public override string[] FindUsersInRole(string roleName, string userNameToMatch)
{
throw new NotSupportedException();
}
public override string[] GetAllRoles()
{
//
}
public override string[] GetRolesForUser(string userName)
{
//
}
public override string[] GetUsersInRole(string roleName)
{
throw new NotSupportedException();
}
public override bool IsUserInRole(string userName, string roleName)
{
//
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[config["connectionStringName"]].ConnectionString;
base.Initialize(name, config);
}
public override void RemoveUsersFromRoles(string[] userNames, string[] roleNames)
{
throw new NotSupportedException();
}
public override bool RoleExists(string roleName)
{
throw new NotSupportedException();
}
}
}