自定义Membership

自定义MembershipAsp net 的 membership 提供了一种存储 验证和管理用户信息以及权限的统一的路径 membership 所对应的验证方式是 asp net 的 Forms 身份验证 注 asp net 的身份验证方式有好几种包括 windows 身份验证 Forms 身份验证 Passport 身份认证当然还有就是没有验证 在 vs2005 中还给 membership 提供了一系列的控件 login 控件 能方便的在 asp

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)//[color=red]该方法需要手动添加[/color]
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=”[color=red]Forms[/color]”/>
<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
















































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230383.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java图书馆新地址_值得你关注的16个顶级 Java 开源项目!小白必看

    java图书馆新地址_值得你关注的16个顶级 Java 开源项目!小白必看1.JavaGuide把这个排第一没有个人因素影响哈!Guide哥我自己大三开始维护的,目前算是纯Java类型项目中Star数量最多的项目了。但是,本仓库的价值远远(+N次)比不上像SpringBoot、Elasticsearch等等这样非常非常非常优秀的项目。希望以后我也有能力为这些项目贡献一些有价值的代码。Github地址:https://github.com/Snailc…

    2022年7月7日
    47
  • 打开pkl文件_smpl是什么文件

    打开pkl文件_smpl是什么文件如何打开pkl文件importpicklepath=’data/dictionary_v1.pkl’#path=’/root/……/aus_openface.pkl’pkl文件所在路径f=open(path,’rb’)data=pickle.load(f)print(data)

    2025年10月13日
    6
  • 新一代金融神话Filecoin[通俗易懂]

    新一代金融神话Filecoin[通俗易懂]Filecoin是区块链史上耗时最短的ICO融资项目,受到了DCG集团、文克莱沃斯兄弟基金会、联合广场风投、AndersonHollotz基金和红杉资本等投资巨头的青睐。储存即收益,Filecoin与BTC的工作证明是不同的。filecoin只需要提供存储空间和宽带,就可以满足获取身份证明的需求。因此,Filecoin可以从根本上提高人类的效率,是一种真正的共享经济,它可以极大地推动存储资源的使用方式。由于Filecoin是基于强大的IPFS协议,并且由于IPFS的大量应用,Filecoin作为IPFS

    2025年11月3日
    5
  • Web前端开发实战4:导航菜单(一)「建议收藏」

    Web前端开发实战4:导航菜单(一)「建议收藏」在前面的博文中我们提到横向一级菜单,这里我们来看看导航菜单。导航菜单种类很多,但是制作原理都是大同小异的,这里看的比二级下拉式菜单还简单。来看一些网站上的导航菜单:    垂直导航菜单:    水平导航菜单:    一垂直菜单   制作原理:(1)用无序列表构建菜单;(2)标签的设置:ullia{display:block;}。定义的

    2022年7月26日
    15
  • 蓝天人眼中的郎凤娥是谁_山西蓝天集团

    蓝天人眼中的郎凤娥是谁_山西蓝天集团蓝天人眼中的郎凤娥,提起郎凤娥,我海中就闪现除了一个忙碌的身影,一个时时刻刻都在为企业未来的发展尽心尽力新女性,这就是郎凤娥。郎凤娥非常看重企业的形象与责任,过去的几年中她曾获得全国三八红旗手、全国五一劳动奖章、全国双学双比女能手、山西省十大女杰、山西省劳动模范、“山西十大杰出女企业家”等等,多的数不过来的荣誉。2011年她还获得了全国资源综合利用年度影响力人物,这让她觉得很欣慰,多年的辛苦没有白…

    2025年6月29日
    5
  • oracle 不是单组分组函数 查询条数,oracle不是单组分组函数 不是单组分组函数怎么解决…

    oracle 不是单组分组函数 查询条数,oracle不是单组分组函数 不是单组分组函数怎么解决…oracleORA-00937:非单组分组函数?这种错误报告通常使用聚合函数,如count和sum,但不使用groupby来声明分组模式。例如,有一个学生表。字段包括:班级编号、学生编号和学生姓名。现在我们需要知道每个班有多少人。如果查询语句是这样的:从学生表中选择班级编号,计数(学生编号),我们必须报告一个错误。我们必须告诉数据库根据哪个字段进行分组。正确的书写方法是:选择班级号,从学生表中…

    2022年6月29日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号