2

默认情况下,ASP.NET MVC 设置 AccountController 以使用 SqlMembershipProvider、SqlProfileProvider 和 SqlRoleProvider。我并不真正需要所有的东西,事实上,将我的数据塑造成那个模型更麻烦。

我需要在 MembershipProvider、RoleProvider 和 ProfileProvider 抽象类上实现的最低要求是什么才能获得身份验证和授权,并且不会破坏可能存在的其他一些依赖关系?

例如,在 ProfileProvider 上,它希望我重写“FindInactiveProfilesByUserName”方法,但我并不真正关心这个功能。当 NotImplementedException 触发时,我的应用程序会在哪里中断?

此外,例如在 MembershipProvider 上,我不需要 FindUsersByEmail 方法。如果我不实现它,ASP.NET MVC 会在某个时候窒息吗?如果有,在哪里?

4

3 回答 3

3

我相信您只需要在 MembershipProvider 上实现 ValidateUser 即可利用 MembershipProvider 的身份验证功能。其余功能由提供的 Web 控件(如 CreateUserWizard)调用,因此请确保在使用这些控件时禁用这些控件上的任何不受支持的功能。至于其余部分(RoleProvider 和 ProfileProvider),如果您不使用与用户角色或用户配置文件相关的任何功能,则不必实现任何成员。

于 2011-02-12T16:39:02.710 回答
3

据我所知,ASP.NET MVC 在身份验证方面并没有真正为您做任何事情。考虑到这一点,正如@chrispr 所说,您应该只需要实现ValidateUser,并且由 ASP.NET MVC 项目模板创建的项目仅在身份验证期间调用该方法。

关于授权,我在 Reflector 中查看了一下AuthorizationAttribute,发现它调用了IPrincipal.IsInRole. System.Web.Security.RolePrincipal在 Reflector 中查看IsInRole调用GetRolesForUser,因此您可以尝试只实现该方法开始。

我出于类似的原因实现了自定义提供程序(我不喜欢 sql 提供程序使用的架构),但我选择不实现自定义配置文件提供程序,因为它似乎依赖于配置文件属性的配置设置,我不想走那条路(请参阅ASP.NET 配置文件属性概述)。

附带说明一下,当我实现自己的提供程序时,我发现在 Reflector 中查看SqlMembershipProviderandSqlRoleProvider很有帮助,因此您可能也想做同样的事情。

于 2011-02-13T06:16:34.250 回答
0

这是我的自定义提供程序中的内容:

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();
        }
    }
}
于 2011-02-13T14:47:40.863 回答