Какова минимальная реализация поставщика ASP.NET, необходимая для аутентификации и авторизации пользователя?

По умолчанию ASP.NET MVC настраивает AccountController для использования SqlMembershipProvider, SqlProfileProvider и SqlRoleProvider. На самом деле мне не нужно все, что приводит к таблице, на самом деле гораздо сложнее преобразовать мои данные в эту модель.

Каков минимум, который мне нужно реализовать в абстрактных классах MembershipProvider, RoleProvider и ProfileProvider, чтобы получить аутентификацию и авторизацию и не нарушить какую-либо другую зависимость, которая может быть там?

Например, в ProfileProvider он хочет, чтобы я переопределил метод «FindInactiveProfilesByUserName», но меня эта функция не волнует. Где мое приложение сломается, когда сработает исключение NotImplementedException?

Кроме того, например, в MembershipProvider мне не нужен метод FindUsersByEmail. Если я не реализую это, в какой-то момент ASP.NET MVC задохнется? Если да, то где?


person jedatu    schedule 12.02.2011    source источник


Ответы (3)


Насколько я знаю, ASP.NET MVC ничего не делает для вас в отношении аутентификации. Имея это в виду, как говорит @chrispr, вам нужно только реализовать ValidateUser, а проект, созданный шаблоном проекта ASP.NET MVC, вызывает этот метод только во время аутентификации.

Что касается авторизации, я взглянул на AuthorizationAttribute в Reflector и обнаружил, что он вызывает IPrincipal.IsInRole. Глядя на System.Web.Security.RolePrincipal в Reflector, IsInRole вызывает GetRolesForUser, поэтому вы можете попробовать реализовать только этот метод для начала.

Я внедрил настраиваемых провайдеров по тем же причинам (мне не нравится схема, которую используют провайдеры sql), но я решил не реализовывать пользовательский провайдер профиля, поскольку он, похоже, полагается на параметры конфигурации для свойств профиля, и я не хотел чтобы пойти по этому пути (см. Обзор свойств профиля ASP.NET).

В качестве примечания я обнаружил, что просмотр SqlMembershipProvider и SqlRoleProvider в Reflector был полезен, когда я реализовывал своих собственных поставщиков, поэтому вы можете сделать то же самое.

person Jeff Ogata    schedule 13.02.2011

Я считаю, что вам нужно только реализовать ValidateUser в MembershipProvider, чтобы воспользоваться функциями аутентификации MembershipProvider. Остальные функции вызываются предоставленными веб-элементами управления, такими как CreateUserWizard, поэтому при их использовании обязательно отключите все неподдерживаемые функции этих элементов управления. Что касается остальных (RoleProvider и ProfileProvider), если вы не используете какие-либо функции, связанные с ролями пользователей или профилями пользователей, вам не нужно реализовывать какие-либо элементы.

person chrispr    schedule 12.02.2011

Вот что у меня есть в моих пользовательских провайдерах:

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();
        }
    }
}
person abatishchev    schedule 13.02.2011