`

自定义Membership

阅读更多
Asp.net的membership提供了一种存储,验证和管理用户信息以及权限的统一的路径。membership所对应的验证方式是asp.net的Forms身份验证(注:asp.net的身份验证方式 有好几种包括windows身份验证 Forms身份验证 Passport身份认证当然还有就是没有验证)。在vs2005中 还给membership提供了一系列的控件(login控件),能方便的在asp.net实现membership。
    具体来说membership能实现:
    1.  创建用户
    2.  可以保存membership信息在sql server,Active Directory以及其他的一些数据保存方法
    3.  鉴别谁在访问你的网站。如果使用login控件,几乎可以在不写代码的情况下完成。
    4.  管理密码。包括 创建 修改 重置
    5.  创建一个唯一的值来标志每一个登陆用户,可以实现对用户的个性化以及角色管理。
    6.  提供一个用户自定义的membership provider,从而实现一些自己网站特有的数据的保存和管理。
    让membership能工作要做的一些工作:
    1.  在web.config中填写一些membership的设置,在asp.net默认情况下membership是被允许使用的 而默认的数据保存是使用ms的sql server.你可以做些设置提供其他的数据保存方法 包括自定义的方法。这将在后面的文章中具体介绍
    2.  设置你的网站使用Forms验证方式,
    3.  为membership定义用户帐号。可以使用vs2005提供的web administrator tool进行设置,也可以自己制作create user页面进行,而自定义页面 只要调用membership.createuser就可以方便的创建用户。
    Membership的管理和配置:
    在web.config中配置管理membership最简单的方法就是使用Web Site Administration Tool(在vs2005的websits菜单里)。你可以指定membership的提供者sql server还是其他,密码的管理 包括是否要加密保存 以及是否要给用户提供根据事先设置的问题 恢复密码的机制。当然是用web site administration tool可以直接创建和管理用户及角色。

    Membership的方便之处在于,当一个用户通过认证之后,他的信息的保存都是系统自动完成的 这样我以前最头痛的如何安全完整的在各个页面中传递登陆用户信息这点就迎刃而解了。
    如果使用vs2005自带的login控件 要清楚一件事 就是login控件的功能实现都是调用了membership的类函数,我们完全可以自己写出所有的控件。

    这里主要是把如何实现自定义的membership记录一下,便于以后查阅。
    首先,我们需要一个数据表来存储用户的个人信息:UserName,Password,Email,PasswordQuestion,PasswordAnswer。
    在vs中新建一个web网站或者web应用程序,新建一个login.aspx登录页面,在login.aspx中拖入一个login控件,在default.aspx页面上拖上两个login控件,首先拖上去一个CreateUserWizard控件,不用做什么修改,接着在CreateUserWizard控件下面放上一个LoginView控件,在LoginView的AnonymousTemplate 视图里拖上一个LoginStatus控件,并把LoginStatus控件的LogoutPageUrl设置为login.aspx。页面部分就这些。
    然后在项目里新建一个类,命名为MyMembershipProvider.cs,类的名字 MyMembershipProvider.继承自MembershipProvider,vs2005会帮我们生成可以重载的函数(右键点击MembershipProvider选择实现虚函数),我们这里不会建立所有的新函数,,我们重载两个属性和两个函数
首先建几个私有变量
    private string connStr;//保存数据库连接字符串
    private bool _requiresQuestionAndAnswer;//是否需要问题和回答
    private int _minRequiredPasswordLength;//最短密码长度
需要重载的属性为:
MinRequiredPasswordLength
RequiresQuestionAndAnswer
重载的函数
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)//该方法需要手动添加
public override bool ValidateUser(string username, string password)//验证用户
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)//创建用户
下面是代码:
    public override int MinRequiredPasswordLength
    {
        get { return _minRequiredPasswordLength; }
    }
    public override bool RequiresQuestionAndAnswer
    {
        get
        {
            return _requiresQuestionAndAnswer;
        }
    }

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        if (config["requiresQuestionAndAnswer"].ToLower() == "true")
        {
            _requiresQuestionAndAnswer = true;
        }
        else
        {
            _requiresQuestionAndAnswer = false;
        }
        int.TryParse (config["minRequiredPasswordLength"],out _minRequiredPasswordLength );
        connStr = config["connectionString"];
        base.Initialize(name, config);
    }

    
    public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            //throw new NotImplementedException();
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connStr);
            try
            {
                conn.Open();
                string sql = "insert into UserInof(username,password,Email,passwordQuestion,passwordAnswer) values(@username,@password,@email,@pq,@pa)";
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, conn);
                command.Parameters.AddWithValue("@username", username);
                command.Parameters.AddWithValue("@password", password);
                command.Parameters.AddWithValue("@email", email);
                command.Parameters.AddWithValue("@pq", passwordQuestion);
                command.Parameters.AddWithValue("@pa", passwordAnswer);
                command.ExecuteNonQuery();
                MembershipUser user = new MembershipUser("MyMembershipProvider", username, providerUserKey, email, passwordQuestion, "", isApproved, true, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
                status = MembershipCreateStatus.Success;
                return user;

            }
            catch
            {
                if (conn.State == System.Data.ConnectionState.Open)
                    conn.Close();
                status = MembershipCreateStatus.ProviderError;
                return null;
            }
        }

        public override bool ValidateUser(string username, string password)
        {
            //throw new NotImplementedException();
            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connStr);
            try
            {
                conn.Open();
                string sql = "select * from UserInfo where username=@username and password=@password";
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, conn);
                command.Parameters.AddWithValue("@username", username);
                command.Parameters.AddWithValue("@password", password);
                System.Data.SqlClient.SqlDataReader reader = command.ExecuteReader();

                if (reader.HasRows)
                {
                    conn.Close();
                    return true;
                }
                else
                {
                    conn.Close();
                    return false;
                }

            }
            catch
            {
                if (conn.State == System.Data.ConnectionState.Open)
                    conn.Close();
                return false;
            }

        }

完成这些代码后 基本上就可以开始测试了,在测试之后我们要建立一个web.config文件在web site中,然后在 <system.web>中填入
                <authentication mode="Forms"/>
<membership defaultProvider="MyMembershipProvider">
<providers>
<add name="MyMembershipProvider" type="MyMembershipProvider" requiresQuestionAndAnswer="true" connectionString="Data Source = localhost;Initial Catalog=Merbership;User Id = sa;Password=123;"/>
</providers>
</membership>
将authentication 修改成 <authentication mode="Forms"/>
之后可以启动页面来进行测试了,login控件会根据web.config的配置使用Membership Provider 我们在web.config中defaultProvider中填入了MyMembershipProvider,它就会用我们自己编写的代码来执行了,你可以修改<add 中的requiresQuestionAndAnswer的值 看看CreateUserWizard控件的显示有什么变化。


参考:
http://www.cnblogs.com/dotLive/archive/2006/08/11/474622.html
BlogEngine.Net,他们自定义了MemberShip Provider,代码也写的很清晰,如果要学习,可以参考他们的代码,在源代码目录:(source)\BlogEngine.Core\Providers\里的DbMembershipProvider.cs和DbRoleProvider.cs




分享到:
评论

相关推荐

    整理的membership验证

    - **自定义 Membership Provider**:允许开发人员创建自定义的 Membership Provider,以适应特定的应用需求。 #### 三、启用 ASP.NET Membership 的步骤 - **配置 web.config 文件**:设置 Membership 的相关选项...

    玩转Membership课程目录

    **自定义Membership Provider** - **概念**:除了使用内置的认证提供程序外,还可以根据项目需求自定义认证逻辑。 - **步骤**:实现`IMembershipProvider`接口,并重写其中的方法来满足特定的需求。 - **优势**:...

    DeadUsersCleaner

    如果使用自定义Membership Provider来实现SharePoint网站用户认证,从自定义用户数据源中删除了用户之后,还需要手工从SharePoint网站中删除对应的SharePoint用户。这个工具可以帮助管理员自动清除那些已从数据源中...

    初识 ASP.NET Membership 用户管理

    ### 自定义Membership提供程序: 当内置的Membership提供程序不满足特定需求时,可以创建自定义的Membership提供程序。自定义提供程序需要继承MembershipProvider抽象类,并实现其方法。通过这种方式,开发者可以...

    Petshop4.doc

    4. **自定义的ASP.NET 2.0 Membership Provider**:针对Oracle 10g数据库,Petshop4创建了专门的自定义Membership Provider,以适应不同的数据库环境,体现了框架的灵活性。 5. **用户状态管理**:通过使用ASP.NET ...

    .net 家教信息平台

    二、MemberShip的扩展与自定义 MemberShip是.NET框架中的身份验证服务,用于管理用户账户和权限。在构建家教信息平台时,我们需要根据业务需求对其进行扩展,例如添加新的用户角色(如学生、教师、管理员),定义...

    Ext+JS高级程序设计.rar

    3.2 自定义Membership提供程序 37 3.3 创建母版页 38 3.4 首页设计 42 3.5 产品列表页 47 3.6 产品详细信息页 51 3.7 登录对话框 56 3.8 用户注册对话框 61 3.9 购物车对话框 65 3.10 结算 70 3.11 为产品详细页添加...

    获取创建Membership的数据库创建脚本

    为了获取创建自定义Membership数据库的脚本,可以使用aspnet_regsql.exe的命令行参数,特别是“-sqlexportonly”参数,这个参数允许你导出用于创建数据库结构的SQL脚本而不实际在数据库中创建这些对象。以下是导出...

    ASP.net Membership角色与权限管理

    CreateUserWizard 控件提供了两种方法来增加自定义注册选项:新建表存放自定义注册选项和结合 Membership 与 Profile。 ASP.net Membership 角色与权限管理提供了一套灵活和安全的用户管理机制,允许开发者轻松地...

    Membership教程

    - **自定义扩展**:除了核心的Membership功能,开发者还可以通过aspnet_Profile添加额外的用户属性,或使用自定义表进行扩展。 总结来说,Membership是ASP.NET 2.0中一个强大的用户管理工具,通过Provider模式和一...

    .net 新特性,membership类的详细用法

    在.NET框架中,Membership类是ASP.NET成员身份验证的核心组件,它为Web应用程序提供了一种管理用户账户的强大机制。这个类库包含了一系列方法和属性,用于处理用户注册、登录、密码重置等常见任务,同时也支持自定义...

    membership(access版)

    4. **测试和使用**:在应用程序中,可以通过标准的ASP.NET Membership API来操作用户账户,如`Membership.CreateUser`,`Membership.ValidateUser`等,这些调用会由自定义的AccessMembershipProvider处理,与Access...

    Membership入门学习

    【Membership入门学习】 Membership是ASP.NET框架中用于网站用户身份验证和权限管理的重要组件。它为开发者提供了一套易于使用的接口和类,帮助构建安全、可扩展的身份验证系统。在这个入门学习中,我们将深入理解...

    Laravel开发-membership

    中间件在Laravel中扮演着过滤器的角色,可以检查请求并执行特定的任务,例如验证用户是否已登录(`auth`中间件)或检查用户是否有执行某操作的权限(自定义权限中间件)。在会员系统中,中间件是实现访问控制的关键...

    基于Membership的高可用性Linux集群.pdf

    4. 配置管理:MBLC(可配置Membership服务)是一种基于Membership的解决方案,它允许管理员自定义故障检测策略和资源恢复策略,以适应不同的业务需求。 5. 网络通信:集群中的节点需要高效的网络通信机制,如TCP/IP...

    membership

    在实际项目中,开发者可以根据需求选择预定义的Membership Provider(如SqlMembershipProvider)或自定义Provider,以适应不同的数据存储需求,如使用MySQL、Oracle等其他数据库,或者使用第三方身份验证服务。...

    强力重置ASP.NET membership加密后的密码!

    总结来说,当需要重置ASP.NET Membership加密后的密码时,我们应该避免尝试解密,而是通过创建自定义MembershipProvider并实现重置密码的逻辑。这个过程中需要注意安全性和合规性,遵循最佳实践来保护用户数据。通过...

    MVC2.0 membership provider 实例(用户验证)

    要创建自定义的`Membership Provider`,首先需要创建一个新的类,继承自`System.Web.Security.MembershipProvider`抽象类,并实现其中的方法。关键方法包括: - `ValidateUser(string username, string password)`:...

    sib-group-membership-mapper:自定义Keycloak协议映射器,用于组成员身份

    sib-group-membership-mapper 用于组成员身份的自定义Keycloak协议映射器。 更改默认的keycloak实现,在该实现中将创建对象数组而不是组字符串数组。建立罐子mvn clean installscp target/sib-group-membership-...

Global site tag (gtag.js) - Google Analytics