2

既定では、ASP.NET MVCは、SqlMembershipProvider、SqlProfileProvider、およびSqlRoleProviderを使用するようにAccountControllerを設定します。テーブルにもたらすすべてのものは本当に必要ではありません。実際、データをそのモデルに形作るのはもっと面倒です。

認証と承認を取得し、そこにある可能性のある他の依存関係を壊さないために、MembershipProvider、RoleProvider、およびProfileProvider抽象クラスに実装する必要がある最小値は何ですか?

たとえば、ProfileProviderでは、「FindInactiveProfilesByUserName」メソッドをオーバーライドする必要がありますが、この機能についてはあまり気にしません。NotImplementedExceptionが発生した場合、アプリはどこで壊れますか?

さらに、たとえばMembershipProviderでは、FindUsersByEmailメソッドは必要ありません。実装しないと、ASP.NET MVCはある時点でチョークしますか?もしそうなら、どこ?

4

3 に答える 3

3

MembershipProviderの認証機能を利用するには、MembershipProviderにValidateUserを実装するだけでよいと思います。残りの機能は、CreateUserWizardなどの提供されたWebコントロールによって呼び出されるため、これらのコントロールでサポートされていない機能を使用する場合は、必ず無効にしてください。残りの部分(RoleProviderおよびProfileProvider)については、ユーザーロールまたはユーザープロファイルに関連する機能を使用していない場合は、メンバーを実装する必要はありません。

于 2011-02-12T16:39:02.710 に答える
3

私の知る限り、ASP.NETMVCは認証に関して実際には何もしません。そのことを念頭に置いて、@ chrisprが言うように、実装する必要があるValidateUserのは、ASP.NET MVCプロジェクトテンプレートによって作成されたプロジェクトは、認証中にのみそのメソッドを呼び出すことです。

承認に関してはAuthorizationAttribute、Reflectorを調べたところ、が呼び出されていることがわかりましたIPrincipal.IsInRoleSystem.Web.Security.RolePrincipalReflectorで見ると、をIsInRole呼び出すGetRolesForUserので、最初はそのメソッドのみを実装してみることができます。

同様の理由でカスタムプロバイダーを実装しましたが(SQLプロバイダーが使用するスキーマは好きではありません)、プロファイルプロパティの構成設定に依存しているようで、カスタムプロファイルプロバイダーを実装しないことを選択しました。そのルートに移動します(ASP.NETプロファイルプロパティの概要を参照)。

ちなみに、自分のプロバイダーを実装するときは、Reflectorでとを確認するSqlMembershipProviderと便利であることがわかったので、同じことを行うことをお勧めします。SqlRoleProvider

于 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 に答える