Какая минимальная реализация провайдера 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();
        }
    }
}
Другие вопросы по тегам