memberShip资料总结

来源:互联网 发布:sq识图软件 编辑:程序博客网 时间:2024/06/06 18:42

                         Membership使用总结

一.建立数据库aspnetDB

1. SQL2005正式版中使用ASPNETDB.MDF数据库

由于没有aspnetdb.mdf数据库,因此得先建立一个,这个可以通过aspnet_regsql.exe完成,该程序位于C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/下。#V_6Jr,T*QC‑W!Z

T
1
、运行它之后会弹出的窗口:按"Next >"按钮
:H5B3q9@Xat S 2
、我们会发现除了有配置数据库外,还有删除数据库的功能,以后说不定可以派上用场,现在自然选Configure SQL Server for application services,按"Next >"按钮&/J I5_K,R-h5Ur
3
、现在进入数据库选择界面,如果SQLSERVER就安装在本地的话,可以不用改任何东西,直接按"Next >"。这里的Database显示为<default>,表示默认数据库名为aspnetdb,你也可以根据自己的需要更改名称。


x#H;z!o[1]i
4
、可以开始安装数据库了,当Finish按钮亮起时,表明数据库安装成功,一切顺利!&V"x7@EG a6y
/Y'K­}//m8KCT_-D
这几天在学ASP.NET,可是在数据库连接时一直出现问题,原因就是在配置安全的时候发生如下错误:出现了如下错误选定的数据存储区出现问题,原因可能是服务器名称或凭据无效,或者权限不足。也可能是未启用角色管理器功能造成的。请单击下面的按钮,以重定向到可以选择新数据存储区的页。下面的消息可能会有助于诊断问题: 无法连接到 SQL Server 数据库。
fDr_ }5U1T
解决方法:
0L#O4df+n$_']
(K/o5A%Z [H![ 1
、打开VS的命令提示,输入aspnet_regsql,用默认的数据库(aspnetdb) ,JA$Q;b M
2
、打开VS,依次:工具-->选项-->数据库工具-->数据连接-->SQL Server实例名称(默认为空),改为你的服务器名称。 v,vmL?L"k
D J

3
、还是VS,工具-->连接到数据库-->服务器名(选择刚才的服务器),选择 microsoft sql server,在服务器名称中填写"." (很重要呦^_^),然后按要求选择WindowsSQL Server身份验证,数据库选择刚才的aspnetdb。测试OK后,在高级里复制出语句 Data Source=Server;Initial Catalog=aspnetdb;User ID=sa V9K.Nb$l3z
4
、打开IIS:默认网站-->属性-->ASP.NET-->编辑全局配置-->常规-->连接字符串管理器LocalSqlServer的连接字符串改为:Data Source=Server;Initial Catalog=aspnetdb;User ID=sa;Password=sa
-Y+U|Tr Ww 5
、还是在IIS:默认网站-->属性-->ASP.NET-->编辑全局配置-->身份验证-->选定"启用角色管理"
/W-{

 

 

 

二.数据库aspnetDB表结构

表名:aspnet_Applications
说明:保存应用程序信息

字段名

 类型

 属性

说明

 ApplicationName

 nvarchar(256)

 

 应用程序名

 LoweredApplicationName

 nvarchar(256)

 

 小写的应用程序名

ApplicationId

 uniqueidentifier

 PK

应用程序的id, GUID

 Description

 nvarchar(256)

 nullable

应用程序的 描述


表名:aspnet_Paths
说明:路径信息

字段名

 类型

 属性

说明

 ApplicationId

 uniqueidentifier

 FK: appnet_Applications.ApplciationId

 应用程序Id

 PathId

 uniqueidentifier

 PK

 路径Id

 Path

 nvarchar(256)

 

 路径信息

 LoweredPath

 nvarchar(256)

 

小写的路径信息

 

表名:aspnet_Users
说明:用户信息

 字段名

 类型

 属性

 说明

 ApplicationId

 uniqueidentifier

 

 应用程序Id

 UserId

 uniqueidentifier

 PK

用户Id

 UserName

 nvarchar(256)

 

 用户名

 LoweredUserName

 nvarchar(256)

 

 小写的用户名

 MobileAlias

 nvarchar(16)

 

 移动电话的pin码(未使用)

 IsAnonymous

 bit

 

 是否为匿名用户

LastActivityDate

 datetime

 

 最后活动日期


表名:aspnet_Membership
说明:成员信息

 字段名

 类型

 属性

 说明

 ApplicationId

 uniqueidentifier

 FK: appnet_Applications.

ApplciationId

 应用程序Id

 UserId

 uniqueidentifier

 FK: aspnet_Users.UserID

用户Id

 Password

 nvarchar(128)

 

 密码

 PasswordFormat

 int

 

存储密码的格式 

 PasswordSalt

 nvarchar(128)

 

密码的Hash

 MobilePIN

 nvarchar(16)

 

 手机PIN

 Email

 nvarchar(256)

 

 电子邮件地址

 LoweredEmail

 nvarchar(256)

 

 小写的电子邮件地址

 PasswordQuestion

 nvarchar(256)

 

 遗忘密码问题

 PasswordAnswer

 nvarchar(128)

 

 遗忘密码答案

 IsApproved

 bit

 

 

 IsLockedOut

 bit

 

 是否锁住

 CreateDate

 datetime

 

 创建时间

 LastLoginDate

 datetime

 

 最后登录时间

 LastPasswordChangedDate

 datetime

 

 最后密码更改时间

 LastLockoutDate

 datetime

 

 最后一次锁帐号的时间

 FailedPasswordAttemptCount

 int

 

 密码失败尝试次数

 FailedPasswordAttemptWindowStart

 datetime

 

 密码失败尝试窗口打开时间

 FailedPasswordAnswerAttemptCount

 int

 

 遗失密码问题尝试次数

 FailedPasswordAnswerAttemptWindowStart

 datetime

 

 遗失密码问题输入窗口打开时间

 Comment

 ntext

 

 备注


表名:aspnet_Roles
说明:角色表

 字段名

 类型

 属性

 说明

ApplicationId

 uniqueidentifier

 FK: appnet_Applications.ApplciationId

应用程序Id

 RoleId

 uniqueidentifier

 PK

 角色Id

 RoleName

 nvarchar(256)

 

 角色名称

 LoweredRoleName

 nvarchar(256)

 

 小的角色名称

 Description

 nvarchar(256)

 nullable

 描述


表名:aspnet_UsersInRoles
说明:用户角色关系表

 字段名

 类型

属性

说明

 UserID

 uniqueidentifier

 FK: aspnet_Users.UserId

用户ID 

 RoleID

 uniqueidentifier

 FK: aspnet_Roles.RoleId

 角色ID


表名:aspnet_Profile
说明:Profile对象存储表

字段名

类型 

属性 

说明 

 UserId

 uniqueidentifier

 FK: aspnet_Users.UserId

 用户ID

 PropertyNames

 ntext

 

 属性名称

 PropertyValuesString

 ntext

 

 字符串值

 PropertyValuesBinary

 image

 

 二进制值

LastUpdatedDate

 datetime

 

最后更新日期 

 

 

三.如何在vs中使用membership

1.对于网站而言,用户身份验证与权限管理是非常重要的部分。

2.通过用户名和密码,对用户进行身份验证,并指派他可以访问的资源,这部分工作一直都是网站开发的重要内容。

3Membershiprolemanager能够非常好的解决这个问题,不但可以对用户的登录信息进行统一管理,还可以就用户的权限进行分类管理,让开发者方便的就网站权限与安全性进行设定。

4. 如何查看使用membership保存的用户信息?

aspnetDB数据库中的aspnet_membership表中可以看到。

5.如果使用自己建立的表,怎么用membership进行操作?

答:membership是内建在framework中的集成的框架,只能操作aspnetDB数据库,所以要么使用自己的数据库,使用自己的操作方法;要么使用membership操作aspnetDB数据库。而且不可以随意改动aspnetDB数据库中的表和字段。

 

6 membership类可以完成以下工作:

1)建立一个新的membershipUser  使用createUser方法

2)可以对用户身份进行验证

3)找回一个membershipUser实例,使用getuser()方法

4)更新一个membershipUser实例

5)通过不同条件找到一个用户

6)获得当前在线用户数量

7)删除一个已经不再需要的账户

 

 

7. MVC中关于Membership类跟数据库的问题

当用到Membership这些关于管理用户啊什么的这些类的时候就会自动创建一个名叫ASPNETDB的数据库。。而像Membership啊。。MembershipUser啊。。MembershipProvider啊。。这几个类所连接到的是这个ASPNETDB数据库吧。。都在这个数据库进行数据读取啊修改啊什么的。。那现在可不可以设置连接到自己的数据库呢。。可以的话具体要怎么做。。不可以的话。。那像我这样需要进行网页用户管理之类的操作。。自己写方法写类来实现的吗。。诚心求高手详细解说。。
 
回答:
Membership它们用的是ASPNETDB这个数据库,但我们可以使用我们自定义的数据库,然而除非我们自定义的数据库有着跟这个ASPNETDB一样的模式,否则ASP.NET提供的默认的SqlMembershipProvider将无法被使用。
也就是说,如果我们还要用ASP.NET提供的SqlMembershipProvider,我们就必须ASPNETDB这个数据库文件或是它的拷贝。明显,这不是我们要的。
为此,若我们使用了自定义的数据库(而非ASPNETDB的拷贝),那么我们就必须写自己的MembershipProvider。步骤如下。
1,定义好自己的数据库,此例中为TestDB01。在我的TestDB01下有一表UserInfo,其下有字段UserIDUserNameUserAge
2,写自己的MembershipProvider,这个类继承自命名空间System.Web.Security下的MembershipProvider类。这一步很简单,创建一个空类,举例名为MyMembershipProvider,技术上说我们可以把它放在应用程序的任何位置,但我把它放在了项目下的一个名为Infrastructure(自己加的)的文件夹下。
这一步的初始代码形式大概如下:
namespace MvcApplication5.Infrastructure
{
 public class MyMembershipProvider : System.Web.Security.MembershipProvider/*我把命名空间写这了*/
 { 
 }
当然,它是空的,它需要我们往里面再加一些东西。。
此时我们把光标放到“System.Web.Security.MembershipProvider”上并右击鼠标,在弹出的下拉框上我们可以看到实现虚拟类(我用的是英文版,我不知道有没有翻译对,原内容是“Emplement Abstract Class”),单击这一选项我们的MyMembershipProvider这个类顿时多了N多个方法,此时它的形式如下(我只截了一部分):
    public class MyMembershipProvider : System.Web.Security.MembershipProvider
    {
        public override string ApplicationName
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        public override bool ChangePassword(string username, string oldPassword, string newPassword)
        {
            throw new NotImplementedException();
        }
 
 //...
 
 public override bool ValidateUser(string username, string password)
        {
            throw new NotImplementedException();
        }
    }
可以看到,这些方法什么都没做,除了抛出一个NotImplementedException异常。当然,这不是我们希望的,这些方法需要我们自己去填充,要不然怎么叫自定义呢。。
呃,现在先把我们先不管别的方法,只看最后的这个ValidateUser()方法。顾名思义,这个正是我们用来验证用户的方法,对其修改如下:
        public override bool ValidateUser(string username, string password)
        {
            SqlConnection sqlconn = new SqlConnection("Data Source=HCNG-PC;Initial Catalog=TestDB01;Integrated Security=True");/*用你的数据源名替换HCNG-PC,且TestDB01是我用来测试的自定义数据库*/
            SqlCommand sqlcmd = new SqlCommand("select UserID, UserName from [UserInfo] where UserName = @userName and UserAge = @userAge", sqlconn);/*这些相信你都明白,若有不明,请补充问题*/
 
            try
            {
                sqlconn.Open();
 
                sqlcmd.Parameters.Add(new SqlParameter("@userName", SqlDbType.NVarChar, 50));
                sqlcmd.Parameters["@userName"].Value = username.Trim();
                sqlcmd.Parameters.Add(new SqlParameter("@userAge", SqlDbType.SmallInt, 2));
                sqlcmd.Parameters["@userAge"].Value = password;
 
                SqlDataReader sqlRd = sqlcmd.ExecuteReader();
                if (sqlRd.HasRows)
                {
                    return true;
                }
 
                return false;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
至此,我们的自定义MembershipProvider算是完成。
3,配置web.config。把此配置文件下的<system.web>节点下的默认的<membership>节点换成如下:
<system.web>
   <membership defaultProvider="MyMembershipProvider">
    <providers>
     <clear/>
     <add name="MyMembershipProvider" <!--前三行要用到的名字。。-->type="MvcApplication5.Infrastructure.MyMembershipProvider"/><!--注意不要漏了命名空间的名字。。-->
    </providers>
   </membership>
4,工作基本完成,只剩查看效果了。
在项目下加一个Default1Controller,在此Default1Controller下加如下action
        [HttpPost]
        public ActionResult Index(string username, string password)
        {
            if (Membership.ValidateUser(username, password))
            {
                ViewData["message"] = "OK";
            }
            else
            {
                ViewData["message"] = "NO";
            }
 
            return View();
        }
发现了吧,用个Membership.ValidateUser()就行了。
 
相信同时你也发现了,这样的自定义MembershipProvider似乎实在是没起到什么特别的作用,至少我是这么认为的。。
而且在MVC中最好不用登录控件,所以我们若在MVC中自定义MembershipProvider跟写自己的会员管理逻辑已没什么差别。。
 
如果你确实要使用自定义的MembershipProvider的话,那么以上代码显然是不够的,比如System.Web.Security.MembershipProvider的第一个方法ChangePassword(),它用来更改用户密码,这需要我们自己写的代码来实现它的逻辑。。
然后是第二个方法ChangePasswordQuestionAndAnswer()用来为用户提供更改问题答案功能,第三个方法CreateUser()来用创建新用户。。
 
以上是MembershipProvider,接下来还有RoleProvider,下面是一个自定义RoleProvider的一部分:
public class MyRoleProvider : RoleProvider
{
public override string[] GetRolesForUser(string username)
{
if (username == "Steve")
return new string[] { "ApprovedMember", "CommentsModerator" };
else
return new string[] { };
}
/* 被省略的部分 */
}
当然,有关RoleProvider,要说的还有它的web.config节点配置,希望你上网查查,如果你还是确定你要用它的话。。
 
还有就是自定义ProfileProvider,跟前二者差不多,同样如果你确定想用它的话。。
 
对于你的问题,概括地回答是:
1,问:那现在可不可以设置连接到自己的数据库呢?答:可以设置连接到自己的数据库。
2,问:可以的话具体要怎么做?答:如上所示。。
3,问:不可以的话?答:没有不可以的话。。只是,如果不想这样做的话,找本书或是网上下个例子就知道了。。
 
最后的话:
我之所以把自定义MembershipProvider写的稍微详细一点,并不是为了告诉你这个东西有多好用,只是告诉你它的原理。呃,我看这个东西就是出于这个目的。。
之所以很是简单地讲了一点自定义RoleProvider跟自定义ProfileProvider,除了实现它们的做法差不多外,更多的是因为打字并不是一件美差。。
而至于为什么我们能如此简单地自定义这些Provider,有兴趣看看设计模式中的策略模式吧。
 
 
如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。

 


原创粉丝点击