博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC中关于Membership类跟数据库的问题
阅读量:7071 次
发布时间:2019-06-28

本文共 6628 字,大约阅读时间需要 22 分钟。

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。把此配置文件下的
节点下的默认的
节点换成如下:
type="MvcApplication5.Infrastructure.MyMembershipProvider"/>
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,跟前二者差不多,同样如果你确定想用它的话。。 ---------------------------------Membership自动生成数据库及数据库访问---------------------------------------------------------------------- 通过执行“aspnet_regsql”命令,可以自动在数据库中创建出11张表,并且提供了若干个API方法来对这11张表进行操作。 可是这11张表中的设计往往也是不符合要求的,如果进行扩展的话,就会比较麻烦。一般扩展的方法有两种:不改变原来的表,但是要建一张表跟以前的表对应,表中的Id跟原来表中一模一样;改变原来表的设计 运行netframwork工具ASP.NET SQL Server注册工具(Aspnet_regsql.exe) 路径:[drive:]\WINDOWS\Microsoft.NET\Framework\versionNumber 文件夹中

ASP.NET SQL Server 注册工具用于创建供 ASP.NET 中的 SQL Server 提供程序使用的 Microsoft SQL Server 数据库,或者用于在现有数据库中添加或移除选项。

可以不带任何命令行参数运行 Aspnet_regsql.exe,以运行一个引导您完成如下过程的向导:为 SQL Server 安装指定连接信息,并为成员资格、角色管理器、配置文件、Web 部件个性化设置及运行状况监视等功能安装或移除数据库元素。(该向导不涉及设置会话状态和 SQL 缓存依赖项。)使用下表所列的选项,还可以将 Aspnet_regsql.exe 作为命令行工具来运行,以便为各个功能指定要添加或移除的数据库元素。

  

Aspnet_regsql.exe 参数详解 -总的信息和功能 -W 是Wizard方式,也就是图形界面的方式。  -C 连接字符串,-如果已经安装了SQL Server可以使用这个参数,连接数据库  -S 服务器名, -可以是数据库的名字或是实例的名  -U 用户名,-登录数据库的用户名,一般会使用这个用户建立数据库表或数据库脚本。  -P 密码,-登录数据库的密码。一般-U 和-P总是一起出现  -E , 无任何参数,这标识你将使用当前的Windows用户作为连接数据库的用户。  -d 数据库名, 使用这个参数制定相应的数据库名,如果没有指定则会默认使用'aspnetdb"的数据库  -sqlexportonly 文件名,参数为要保存的文件名,参数标识只产生数据库的脚本和配置脚本,而不进行任何的操作。  -A all|m|r|p|c|w ,-A 表示允许或打开某个功能,m表示membership功能,r 表示Role 管理功能,p表示Profile功能,c表示Web Parts 个性化功能,w表示 Web 事件,all表示打开/可用上面所有的全部功能  -R all|m|r|p|c|w -R 表示移除或禁止某个功能,m表示membership功能,r 表示Role 管理功能,p表示Profile功能,c表示Web Parts 个性化功能,w表示 Web 事件,all表示禁止/关闭上面所有的全部功能  比如: aspnet_regsql.exe –A p –E --Session State 特性  -ssadd ,打开/可用SQL Server 模式的Session State方式  -ssremove ,关闭/移除SQL Server 模式的Session State方式  -sstype t|p|c ,指定具体的方式,t 表示Session State的数据和状态将放在SQL Server的'tempdb"数据库中,管理脚本和存储过程会保留在“ASPState”的数据库中,如果机器启动,则Session State会不被保存,这也是默认的设置。p表示,Session State的数据和状态以及相关的存储过程都将放在SQL Server的'ASPState"数据库中;c表示,Session State的数据和状态以及相关的存储过程都将放在由-d 参数指定的SQL Server的数据库  比如:aspnet_regsql -S localhost -U sa -P wrox -ssadd -sstype p --SQL Cache Dependency 特性  -ed ,没有参数表示,可用/打开SQL Cache Dependency 特性  -dd,没有参数,表示关闭/禁止SQL Cache Dependency 特性  -et,没有参数,但必须跟-t 参数,表示那个表打开/可以使用SQL Cache Dependency 特性  -dt, 没有参数,但必须跟-t 参数,表示禁止/关闭某个表的SQL Cache Dependency 特性  -t 表名,一个数据库的表名,必须和-et 或-dt一起使用  -lt ,没有参数,将查询数据库,列出所有使用QL Cache Dependency 特性的数据库表 比如: aspnet_regsql.exe -S localhost -U sa -P password -d Northwind -t Products –et

转载于:https://www.cnblogs.com/meiCode/p/4314013.html

你可能感兴趣的文章
浅谈VS编译自定义编译任务—MSBuild Task(csproject)
查看>>
推荐20个优秀的网页色彩搭配实例
查看>>
搜集点shell资料
查看>>
望江南
查看>>
P42S25C查看开机次数、时间、坏点的方法
查看>>
node.js 初体验
查看>>
Cnblogs metaweblog api link
查看>>
wcf的部署
查看>>
在自己实现的ios画图程序中如何实现橡皮擦功能
查看>>
android开发录音和播放录音的例子
查看>>
Hibernate中one-to-one的深入学习
查看>>
开发人员经常会使用的15个jquery谷歌地图插件
查看>>
wcf out参数 异步调用问题
查看>>
ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]
查看>>
C# Attribute
查看>>
用Hadoop1.0.3实现KMeans算法
查看>>
[Z]Computer Modern的故事
查看>>
Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站
查看>>
[C#]DataTable常用操作总结【转】
查看>>
JdbcTemplate查询数据 三种callback之间的区别
查看>>