Qual è l'implementazione minima del provider ASP.NET di cui ho bisogno per ottenere un utente autenticato e autorizzato?

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

Domanda

Per impostazione predefinita ASP.NET MVC imposta l'accountController per utilizzare SQLMembershipProvider, SQLProfileProvider e SQLRoleProvider. Non ho davvero bisogno di tutto ciò che porta al tavolo, in effetti, è più una seccatura modellare i miei dati in quel modello.

Qual è il minimo che devo implementare sulle classi astratte di MembershipProvider, RoleProvider e ProfileProvider per ottenere autenticazione e autorizzazione e non rompere qualche altra dipendenza che potrebbe essere lì?

Ad esempio, su ProfileProvider vuole che io sovrascrivi il metodo "FindinactiveProfilesByuserName", ma non mi interessa davvero questa funzione. Dove si romperà la mia app quando si accende il notimplementException?

Inoltre, su MembershipProvider, ad esempio, non ho bisogno del metodo FindUSersByEmail. Se non implemento, ASP.NET MVC soffocante ad un certo punto? In tal caso, dove?

È stato utile?

Soluzione

Per quanto ne so, ASP.NET MVC non fa davvero nulla per te per quanto riguarda l'autenticazione. Con questo in mente, come dice @chrispr, dovresti solo implementare ValidateUser, e il progetto creato dal modello di progetto ASP.NET MVC chiama solo quel metodo durante l'autenticazione.

Per quanto riguarda l'autorizzazione, ho dato un'occhiata AuthorizationAttribute nel riflettore e ha scoperto che chiama IPrincipal.IsInRole. Guardando System.Web.Security.RolePrincipal In riflettore, IsInRole chiamate GetRolesForUser, quindi potresti provare a implementare solo quel metodo per iniziare.

Ho implementato provider personalizzati per motivi simili (non mi piace lo schema utilizzato dai provider SQL), ma ho scelto di non implementare un provider di profili personalizzati poiché sembra fare affidamento su impostazioni di configurazione per le proprietà del profilo e non lo desideravo Per seguire quel percorso (vedi Panoramica delle proprietà del profilo ASP.NET).

Come nota a margine, ho scoperto che guardando il SqlMembershipProvider e SqlRoleProvider In Reflector è stato utile quando ho implementato i miei provider, quindi potresti voler fare lo stesso.

Altri suggerimenti

Credo che tu debba solo implementare ConvalidateUser sul DripplershipProvider per sfruttare le caratteristiche di autenticazione di MembershipProvider. Il resto delle funzionalità è invocato da controlli Web forniti come CreateUserWizard, quindi assicurati di disabilitare una qualsiasi delle funzionalità non supportate su tali controlli quando le usano. Per quanto riguarda il resto (RoleProvider e ProfileProvider), se non si utilizza alcuna delle funzionalità relative ai ruoli utente o ai profili utente, non è necessario implementare nessuno dei membri.

Ecco cosa ho nei miei fornitori personalizzati:

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

e:

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();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top