概述
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 >"按钮
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 数据库。
解决方法:
1 、打开 VS 的命令提示,输入 aspnet_regsql ,用默认的数据库 (aspnetdb) 。 ,JA$Q;b M
2 、打开 VS ,依次:工具 --> 选项 --> 数据库工具 --> 数据连接 -->SQL Server 实例名称 ( 默认为空 ) ,改为你的服务器名称。 v,vmL?L"k
D J
3 、还是 VS ,工具 --> 连接到数据库 --> 服务器名 ( 选择刚才的服务器 ) ,选择 microsoft sql server, 在服务器名称中填写 "." ( 很重要呦 ^_^), 然后按要求选择 Windows 或 SQL 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 。
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码 |
| 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.通过用户名和密码,对用户进行身份验证,并指派他可以访问的资源,这部分工作一直都是网站开发的重要内容。
3.Membership和rolemanager能够非常好的解决这个问题,不但可以对用户的登录信息进行统一管理,还可以就用户的权限进行分类管理,让开发者方便的就网站权限与安全性进行设定。
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,其下有字段UserID,UserName,UserAge。
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,有兴趣看看设计模式中的“策略模式”吧。
如果不明白的话,请补充问题,希望我能帮到你。
如果这对你有帮助话,请将此标为最佳答案,谢谢。
最后
以上就是俊秀电脑为你收集整理的memberShip资料总结的全部内容,希望文章能够帮你解决memberShip资料总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复