Какая минимальная реализация провайдера ASP.NET мне нужна для аутентификации и авторизации пользователя? - PullRequest
2 голосов
/ 12 февраля 2011

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 13 февраля 2011

Насколько я знаю, 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 был полезен, когда я реализовал своих собственных провайдеров, поэтому вы можете захотеть сделать то же самое.

3 голосов
/ 12 февраля 2011

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

0 голосов
/ 13 февраля 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();
        }
    }
}
...