.NET 4.0中的自定义MembershipProvider

时间:2011-04-18 10:40:06

标签: asp.net asp.net-membership membership-provider

这里有一些关于这个问题的线索,但是大多数都已过时,其中的参考链接更加过时。

我得到了这个网站,我需要使用它自己的表结构连接到外部sql server(mssql),使用默认的asp.net成员资格提供程序结构不是一个选项。表格布局非常简单,并且使用方式看起来像这样(它叫做个人)

Individuals
- UserGuid (uniqueidentifier/guid, unique)
- Name (varchar)
- Password (varchar)
- HasAccess (tinyint/ 1 or 0)
- DateTime (datetime)
- Log (xml)

所需的功能只是记录某人,其余的没有必要:)

我遵循了一些指南,但其中大多数已经过时且非常复杂。不幸的是,msdn示例遵循这种模式,文档不是很好。

因此,如果有人获得了一些资源,显示如何或愿意发布代码示例或类似内容,我会很感激。

谢谢!

2 个答案:

答案 0 :(得分:62)

真的很简单:

  1. 创建一个新的类文件(如果你没有在项目的Models文件夹中使用多层系统),我们称之为MyMembershipProvider.cs

  2. System.Web.Security.MembershipProvider

  3. 继承该类
  4. 自动创建所需的方法(继承类中的句点+空格)

  5. 完成!

    所有方法都有NotImplementedException例外,您只需编辑每个方法并输入自己的代码即可。例如,我定义了GetUser,如下所示:

    public override MembershipUser GetUser(string username, bool userIsOnline)
    {
        return db.GetUser(username);
    }
    

    db是我作为

    添加到类中的数据库存储库
    MyServicesRepository db = new MyServicesRepository();
    

    在那里,您会发现GetUser方法为:

    public MembershipUser GetUser(string username)
    {
        OS_Users user = this.FindUserByUsername(username);
    
        if (user == null)
            return
            new MembershipUser(
                providerName: "MyMembershipProvider",
                name: "",
                providerUserKey: null,
                email: "",
                passwordQuestion: "",
                comment: "",
                isApproved: false,
                isLockedOut: true,
                creationDate: DateTime.UtcNow,
                lastLoginDate: DateTime.UtcNow,
                lastActivityDate: DateTime.UtcNow,
                lastPasswordChangedDate: DateTime.UtcNow,
                lastLockoutDate: DateTime.UtcNow);
    
        return
            new MembershipUser(
                providerName: "MyMembershipProvider",
                name: user.username,
                providerUserKey: null,
                email: user.email,
                passwordQuestion: "",
                comment: "ANYTHING you would like to pass",
                isApproved: true,
                isLockedOut: user.lockout,
                creationDate: user.create_date,
                lastLoginDate: user.lastLoginDate,
                lastActivityDate: user.lastActivityDate,
                lastPasswordChangedDate: user.lastPasswordChangedDate,
                lastLockoutDate: user.lastLockoutDate);
    }
    

    为您使用的所有方法执行此操作(调试项目并查看您需要的方法) - 我只使用一些,而不是全部,因为我并不真正关心ChangePasswordQuestionAndAnswer,{{1}等方法等等

    只需确保在DeleteUser中添加新的成员资格为:

    web.config

    你有一个很好的视频教程来自Chris Pels(2007年,但仍然大部分有效)和代码,尽管视频教程是在VB中,但让你理解这些步骤......

      

    http://www.asp.net/general/videos/how-do-i-create-a-custom-membership-provider

    我不仅创建了自己的会员提供商,而且我创建了我的角色提供商,从上面的代码中可以看出,就像在会员单上一样简单,让你在你的应用程序中使用类似的东西:

    <membership defaultProvider="MyMembershipProvider">
      <providers>
        <clear/>
        <add name="MyMembershipProvider" type="Your.NameSpace.MyMembershipProvider" connectionStringName="OnlineServicesEntities"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>
    

    [Authorize(Roles = "Partner, Admin")]
    public ActionResult MyAction()
    {
    
    }
    

    什么是自动创建所需的方法(继承类中的句点+空格)

    您可以右键单击,或将光标放在名称上,然后按 Control + ,然后按 space

答案 1 :(得分:0)

  

这里有几个主题   关于这个问题,但大多数都是   过时的和参考链接   它们甚至更加过时了。

自从在Framework 1.0中引入ASP.NET以来,Page.User / CurrentSession.User / IPrincipal / IIdentity模型保持不变。在Framework 2.0中,添加了成员​​资格提供程序。那些“过时的”参考仍然是有效的指导。 MSDN