Quelle est l’implémentation minimale du fournisseur ASP.NET dont j’ai besoin pour qu’un utilisateur soit authentifié et autorisé ?

StackOverflow https://stackoverflow.com/questions/4978951

Question

Par défaut, ASP.NET MVC configure AccountController pour utiliser SqlMembershipProvider, SqlProfileProvider et SqlRoleProvider.Je n'ai pas vraiment besoin de tout ce qui m'apporte, en fait, c'est plus compliqué de façonner mes données dans ce modèle.

Quel est le minimum que je dois implémenter sur les classes abstraites MembershipProvider, RoleProvider et ProfileProvider pour obtenir l'authentification et l'autorisation et ne pas rompre une autre dépendance qui pourrait être là ?

Par exemple, sur ProfileProvider, il veut que je remplace la méthode "FindInactiveProfilesByUserName", mais je ne me soucie pas vraiment de cette fonctionnalité.Où mon application va-t-elle s'arrêter lorsque l'exception NotImplementedException se déclenche ?

De plus, sur MembershipProvider par exemple, je n'ai pas besoin de la méthode FindUsersByEmail.Si je ne l'implémente pas, ASP.NET MVC s'étouffera-t-il à un moment donné ?Si oui, où ?

Était-ce utile?

La solution

Autant que je sache, ASP.NET MVC ne fait rien pour vous en matière d'authentification.Dans cet esprit, comme le dit @chrispr, il vous suffit d'implémenter ValidateUser, et le projet créé par le modèle de projet ASP.NET MVC appelle uniquement cette méthode lors de l'authentification.

Concernant l'autorisation, j'ai jeté un oeil à AuthorizationAttribute dans Reflector et j'ai constaté qu'il appelle IPrincipal.IsInRole.Regarder System.Web.Security.RolePrincipal dans Réflecteur, IsInRole appels GetRolesForUser, vous pouvez donc essayer d'implémenter uniquement cette méthode pour commencer.

J'ai implémenté des fournisseurs personnalisés pour des raisons similaires (je n'aime pas le schéma utilisé par les fournisseurs SQL), mais j'ai choisi de ne pas implémenter de fournisseur de profil personnalisé car il semble s'appuyer sur les paramètres de configuration des propriétés du profil, et je ne voulais pas suivre cette voie (voir Présentation des propriétés du profil ASP.NET).

En passant, j'ai découvert qu'en regardant le SqlMembershipProvider et SqlRoleProvider dans Reflector m'a été utile lorsque j'ai implémenté mes propres fournisseurs, vous voudrez peut-être faire de même.

Autres conseils

Je pense que vous n'avez besoin que de mettre en œuvre ValidateUser sur le fournisseur de membres pour tirer parti des fonctionnalités d'authentification des membresProvider.Les autres fonctionnalités sont invoquées par des contrôles Web fournis tels que CreateUserWizard, assurez-vous donc de désactiver l'une des fonctionnalités non prises en charge sur ces contrôles lorsque vous les utilisez.En ce qui concerne le reste (RoLeProvider et ProfileProvider), si vous n'utilisez aucune des fonctionnalités relatives aux rôles d'utilisateur ou aux profils d'utilisateurs, vous n'avez pas à mettre en œuvre l'un des membres.

Voici ce que j'ai dans mes fournisseurs personnalisés:

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)
        {
            //
        }
    }
}

et:

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();
        }
    }
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top