定制会员实施

时间:2014-02-23 00:39:43

标签: asp.net-mvc asp.net-membership custom-membershipprovider

我总是使用自己的代码来创建登录和注册,但使用成员资格可以节省我在以下项目中编程这些东西的大量时间。

现在我发现了很多关于实现自己的自定义成员资格的教程,其中一些与其他成员有所不同。我很难理解实现简单的自定义成员资格实施的最佳解决方案。

对于这个项目,我只需要添加一些额外的用户信息,如街道名称,邮政编码等。

我目前所做的是:

     public class CustomMembershipUser : MembershipUser
{
    public CustomMembershipUser(
        string providerName,
        string name,
        object providerUserKey,
        string email,
        string passwordQuestion,
        string comment,
        bool isApproved,
        bool isLockedOut,
        DateTime creationDate,
        DateTime lastLoginDate,
        DateTime lastActivityDate,
        DateTime lastPasswordChangedDate,
        DateTime lastLockoutDate
        )
        : base(providerName, name, providerUserKey, email, passwordQuestion,
        comment, isApproved, isLockedOut, creationDate, lastLoginDate,
        lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
    {
    }

    // Add additional properties
    public string Streetname { get; set; }
    public string Postcode { get; set; }

}

public abstract class CustomMembershipProvider : MembershipProvider
{

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        // get data logic
        var user = new CustomMembershipUser(
                    "CustomMembershipProvider",
                    "naam",
                    "1",
                    "adasd@live.com",
                    "",
                    "",
                    true,
                    false,
                    DateTime.Now,
                    DateTime.MinValue,
                    DateTime.MinValue,
                    DateTime.MinValue,
                    DateTime.MinValue) { Streetname = "Test", Postcode = "Test2"};

        return user;

    }

    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer,
        bool isApproved, object providerUserKey, out MembershipCreateStatus status)
    {
        var user = new CustomMembershipUser(
                "CustomMembershipProvider",
                "naam",
                "1",
                "adasd@live.com",
                "",
                "",
                true,
                false,
                DateTime.Now,
                DateTime.MinValue,
                DateTime.MinValue,
                DateTime.MinValue,
                DateTime.MinValue) { Streetname = "Test", Postcode = "Test2" };
        status = MembershipCreateStatus.Success;
        return user;
    }
}

这是我的自定义会员资格的最佳解决方案还是有更好的选择?

我还没有测试过,所以我不知道这是否有效。

我正在使用MVC 4.

2 个答案:

答案 0 :(得分:1)

我建议使用ASP.NET身份:http://www.asp.net/identity

IdentityUser收集的内容之上添加其他数据相对容易。这是默认的用户表:

  • 编号
  • 用户名
  • PasswordHash
  • SecurityStamp

要在此基础上添加数据,您只需继承IdentityUser

public class AppUser : IdentityUser
{
    // Add additional properties
    public string Streetname { get; set; }
    public string Postcode { get; set; }
}

您可以根据需要添加其他字段,但据我所知,MembershipProvider是一个过时的系统来处理身份验证,因为ASP.NET身份更加灵活和开放。 / p>

我还建议将所有额外字段偏移到Profile类 - 只是我发现要好得多的东西 - 用所有这些不同字段填充配置文件表而不是用户表 - 但我认为这取决于个人偏好。

答案 1 :(得分:1)

首先要了解的是会员资格,它与名称,地址等无关......它严格来说是用户名,用户名,密码和身份验证。而已。不要试图扩展它来添加名称和地址,这不是它的用途。

相反,您只需创建自己的“UserProfile”表或任何您想要调用它的表。此表应键入成员资格提供程序提供的ProviderUserKey。然后,您只需要在UserProfile表中查找所需的任何数据,而无需修改与Membership相关的任何内容。

因此,在您的情况下,您可以使用标准成员资格提供程序,该成员资格提供程序键入GUID。然后创建一个名为UserProfile的表,该表有3列。 UserId(uniqueidentifier),StreetName和PostalCode。

在您的应用程序中,您调用Membership.GetUser()。ProviderUserKey并将其用作在UserProfile表中查找数据的键。这很快,很简单,并且不需要对成员资格进行自定义修改。

在您的AccountController.Register方法中,您可以在创建成员资格用户之后,还创建一个UserProfile记录,其中包含用户ProviderUserKey以及您想要存储的信息。