1

我是 ASP.NET MVC 3 的新手,正在处理我从 Visual Studio master 继承的数据库。有很多存储过程和用户​​角色aspnet_Membership_BasicAccess,例如aspnet_Membership_FullAccess等。

我真的需要这一切吗?

我记得其他 MVC 解决方案,例如 Ruby on Rails 的 Devise 身份验证插件:它只需要一两个表和一个数据库访问角色——而且它仍然非常安全。

支持 ASP.NET MVC 3 用户管理的最小数据库结构是什么?

4

3 回答 3

1

简短的回答是是的,您需要所有这些,因为会员系统依赖于所有这些存储过程和角色。

更长的答案是,你会使用会员资格吗?如果没有,那么没有。如果您要使用会员资格,您会使用 SqlMembershipProvider 吗?如果是这样,那么是的,你需要这些。如果您打算改用通用提供程序,那么您将需要不同的设置表和支持配置。

所以在不知道你在做什么的情况下,我们只能说,如果你不明白它为什么在那里,那就不要惹它。

我不明白你为什么提到 Rails,因为它是一个完全不同的工具集和框架。这就像抱怨你的摩托车需要汽油和油,而你的自行车不需要(我不是说 Rails 的功能不那么强大,只是说它不同)。

ASP.NET MVC 本身并不进行用户管理,但它确实包含了一些依赖于默认 ASP.NET Membership 系统的模板。在 Visual Studio 2010 中,它默认使用 SqlMembershipProvider,但在 Visual Studio 2012 中,它默认使用 MVC3 的 Universal Providers,而 MVC4 中默认使用 SimpleMembership。

ASP.NET MVC 不知道也不关心您如何进行用户管理,它不是框架的一部分。它通过授权过滤器委托它,默认情况下只查看 ASP.NET IIdentity 和 IPrincipal。

如果您要进行用户管理,您需要决定如何进行。要么自己滚动(自定义成员资格提供程序、自定义 IIdentity 和 IPrincpal 提供程序等),要么使用现有的成员资格提供程序(有很多,Microsoft 至少有六个不同的)。或者您可以选择使用默认值,在这种情况下,它几乎已经处于最低限度的情况下。

于 2013-05-21T20:47:31.127 回答
1

如果您从成员资格提供程序派生并创建自己的自定义提供程序,则可以实现非常少的属性集。

public class CustomMembershipProvider : MembershipProvider
{
    private string _appName;
    private bool _EnablePasswordReset;
    private bool _EnablePasswordRetrieval;
    private int _MaxInvalidPasswordAttempts;
    private int _MinRequiredNonalphanumericCharacters;
    private int _MinRequiredPasswordLength;
    private int _PasswordAttemptWindow;
    private MembershipPasswordFormat _PasswordFormat;
    private string _PasswordStrengthRegularExpression;
    private bool _RequiresQuestionAndAnswer;
    private bool _RequiresUniqueEmail;

    public override string ApplicationName
    {
        get
        {
            return this._appName;
        }
        set
        {
            this._appName = value;
        }
    }

    public override bool ChangePassword(string username, string oldPassword, string newPassword)
    {
        throw new NotImplementedException();
    }

    public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
    {
        throw new NotImplementedException();
    }

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        throw new NotImplementedException();
    }

    public override bool DeleteUser(string username, bool deleteAllRelatedData)
    {
        throw new NotImplementedException();
    }

    public override bool EnablePasswordReset
    {
        get { return this._EnablePasswordReset; }
    }

    public override bool EnablePasswordRetrieval
    {
        get { return this._EnablePasswordRetrieval; }
    }

    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
    {
        throw new NotImplementedException();
    }

    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
    {
        throw new NotImplementedException();
    }

    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
    {
        throw new NotImplementedException();
    }

    public override int GetNumberOfUsersOnline()
    {
        throw new NotImplementedException();
    }

    public override string GetPassword(string username, string answer)
    {
        throw new NotImplementedException();
    }

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        throw new NotImplementedException();
    }

    public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
    {
        throw new NotImplementedException();
    }

    public override string GetUserNameByEmail(string email)
    {
        throw new NotImplementedException();
    }

    public override int MaxInvalidPasswordAttempts
    {
        get { return this._MaxInvalidPasswordAttempts; }
    }

    public override int MinRequiredNonAlphanumericCharacters
    {
        get { return this._MinRequiredNonalphanumericCharacters; }
    }

    public override int MinRequiredPasswordLength
    {
        get { return this._MinRequiredPasswordLength; }
    }

    public override int PasswordAttemptWindow
    {
        get { return this._PasswordAttemptWindow; }
    }

    public override MembershipPasswordFormat PasswordFormat
    {
        get { return this._PasswordFormat; }
    }

    public override string PasswordStrengthRegularExpression
    {
        get { return this._PasswordStrengthRegularExpression; }
    }

    public override bool RequiresQuestionAndAnswer
    {
        get { return this._RequiresQuestionAndAnswer; }
    }

    public override bool RequiresUniqueEmail
    {
        get { return this._RequiresUniqueEmail; }
    }

    public override string ResetPassword(string username, string answer)
    {
        throw new NotImplementedException();
    }

    public override bool UnlockUser(string userName)
    {
        throw new NotImplementedException();
    }

    public override void UpdateUser(MembershipUser user)
    {
        throw new NotImplementedException();
    }

    public override bool ValidateUser(string username, string password)
    {
        //put your db code here.
    }
}

然后你需要修改你的 web.config 文件来调用你的新提供者

<membership defaultProvider="CustomMembershipProvider">
  <providers>
    <clear/>
    <add name="CustomMembershipProvider"
         type="MembershipExample.Providers.CustomMembershipProvider, MembershipExample"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>

如果您有任何特定的基于角色的安全性,您还可以实现自己的自定义角色提供程序

于 2013-05-21T21:05:39.127 回答
1

您所指的是一个遗留的成员资格提供程序,其中表的前缀为aspnet.

新的 ASP.NET 通用提供程序不再使用存储过程。相反,它使用实体框架,它更干净一些。

如果你想要最小的数据库结构,你可能想看看SimpleMembership

于 2013-05-22T00:14:17.683 回答