自定义会员提供商是否真的值得关注?

时间:2011-12-08 06:15:32

标签: c# asp.net .net asp.net-mvc-3 asp.net-membership

经过多长时间尝试回答我的问题“我应该编写自定义MembershipProvider实现还是制作我自己的自定义系统?”因此我决定以MembershipProvider的方式开始编写我的会员提供者并不是那么糟糕。但当时我觉得有些麻烦。

例如,在我的系统中没有用户名。电子邮件是用户名。所以CreateUser方法应如下所示:

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
    bool userExists = GetUser(email);
    if (userExists) {
        status = MembershipCreateStatus.DuplicateEmail;
        return null;
    }
    bool? tryExists = regTryExists(email);
    if (tryExists.HasValue && tryExists.Value && !userExists)
    {
        UserRepository.CreateUser(email, password);
        status = MembershipCreateStatus.Success;
        return GetUser(email);
    }

    return null;
}

此外,我不需要GetUserNameByEmailFindUsersByName方法:

public override string GetUserNameByEmail(string email)
{
    return email;
}  

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

所以这里我不需要username, passwordQuestion, passwordAnswer, isApproved个参数。

另外,在我的系统中没有用户问题,所以我不需要像

那样的方法
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
    return false;
}
public override string ResetPassword(string username, string answer)
{
    throw new NotImplementedException();
}

这只是浪费和繁琐的会员制度的一部分。它并不像我想的那么可靠。

所以问题是,使用MembershipProvider真的值得吗?你能带我过来吗? MembershipSystem是否有很好的优势,使其成为真正的价值体系?

5 个答案:

答案 0 :(得分:4)

使用MembershipProvider基本上归结为任何开发人员(或开发人员)必须做出的“构建或购买”决策:从头开始构建它,或者购买现成的(或者在这种情况下,使用pre-pre现有工具)。

考虑到这一点......诚然,MembershipProvider并不完美 - 它有点笨重,可能有太多(或太少)你需要的东西 - 但它的85%是大多数实现。正如其他人所提到的那样,从头开始构建自己的身份验证系统并不值得花时间或精力。 这是一个已解决的问题;用你的发展能量来解决更紧急和相关的业务问题,而不是重新发明轮子!

记住这个公理:除非你能从头开发一些东西获得直接的竞争优势,否则你(通常)会更好地使用现有的工具(买,不建)。

答案 1 :(得分:1)

ASP.NET成员资格提供程序API的一些优点:

  • 您不必重新发明轮子。您项目的新成员将熟悉众所周知的API。
  • 已经有可以重复使用或启动的实现(主要是SQL Server,Active Directory)。
  • 它与ASP.NET(登录控件等)在视觉上集成在一起
  • 您可以使用内置的ASP.NET管理工具来创建用户&角色(它实际上是一种检查提供商的好方法,因为它应该与该工具一起使用)
  • 它可以与.NET(不仅是ASP.NET)Identity / Principal类集成,并且可以用于支持PermissionAttribute系统(与关联的Role Provider)。虽然它在技术上存在于System.Web.dll中,但实际上您可以在非Web系统中使用它。
  • 最后一件事,但非常有趣:您还可以在WCF services
  • 中使用ASP.NET成员资格提供程序

答案 2 :(得分:0)

好的MembershipProvider确实很有用。完整的ASP.Net安全基础架构围绕它构建。许多控件可以直接与此基础结构进行交互,例如Login,LoginStatus。所以它确实有它的优点。
但由于界面肥胖,它也有相当大的问题。它打破了界面分离原则,因此使用起来有点麻烦。我相信这些优势超过了我们在这里付出的代价。因此,只要有简单的解决方法,使用它就没有任何危害。
建立自己的安全基础设施也不是一项微不足道的任务。

答案 3 :(得分:0)

听起来默认MembershipProvider可以做你需要做的一切 因此,我肯定会建议创建一个包含UserBusiness的{​​{1}}类,并且只公开您使用的功能。

这样可以轻松使用MembershipProvider的强大功能,同时还可以根据需要简化界面。

答案 4 :(得分:0)

我首先使用自定义提供程序,但现在已完全切换。

我只保留了一个原则,比如何时锁定用户,如何哈希密码等等

我需要自定义提供程序,直到我需要不同数据库的多租户支持。最后一滴是我尝试单元测试使用成员资格提供程序的WCF服务。现在我有会员服务,生活很美好。我仍然有几乎与原始数据结构相同的数据结构,但在.NET中我使用我的代码