动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   .Net → 阅读文章

 ASP.NET Whidbey中实现Provider

作者来源: 
阅读 1559 人次 , 2006-3-29 4:34:00 

  “whidbey”是微软工具套件的下一个版本。按照微软的计划,它将会在2004年底推出。

  asp.net 2.0(codename whidbey)通过provider模式为用户验证、角色管理等方面提供了非常强大易用的框架模型。whidbey中提供了一个asp.net configuration工具,通过它可以非常容易地配置用户信息数据库,管理角色等等,再与新加入的security控件配合,几乎不用写什么代码就能够实现用户验证和角色管理功能。关于这些控件和配置工具的具体使用,可以参考这篇文章:使用更精简的代码保证 asp.net 应用程序的安全

  但是在pdc preview版本的whidbey中,这个配置工具的功能还不是很完善。从我使用的情况来看,它目前还只能创建和连接自己的demo用的access数据库,不能连接sql server数据库进行扩展。因此,为了能够连接sql server,我们必须提供我们自己的providers。这里以连接ibuyspy的portal数据库为例来说明如何实现一个membership provider。

  为了搞清楚如何实现我们自己的membership provider,有必要先看看whidbey默认使用的membership provider是如何做的。在machine.config配置文件中,whidbey使用类似下面这样的配置实现:

<membership defaultprovider="aspnetaccessprovider" userisonlinetimewindow="15" >
<providers>
<add name="aspnetsqlprovider"
 type="system.web.security.sqlmembershipprovider, system.web, version=1.2.3400.0,  culture=neutral, publickeytoken=b03f5f7f11d50a3a" connectionstringname="localsqlserver"
enablepasswordretrieval="false"
enablepasswordreset="true"
requiresquestionandanswer="false"
applicationname="/"
requiresuniqueemail="false"
passwordformat="hashed"
description="stores and retrieves membership data from the local microsoft sql server database"
/>

<add name="aspnetaccessprovider"
type="system.web.security.accessmembershipprovider, system.web, version=1.2.3400.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a"
connectionstringname="accessfilename"
enablepasswordretrieval="false"
enablepasswordreset="true"
requiresquestionandanswer="false"
applicationname="/"
requiresuniqueemail="false"
passwordformat="hashed"
description="stores and retrieves membership data from the local microsoft access database file"
/>

</providers>
</membership> 

  关于这段配置文件的更详细解说,可以参考《a first look at asp.net v. 2.0》。
  可以看出,whidbey默认使用sqlmembershipprovider或者accessmembershipprovider来进行用户验证和管理。这两个provider实现了iprovider和imembershipprovider接口,实际上这两个接口也是每个membershipprovider所必需的,其中iprovider负责provider的初始化,而imembershipprovider则实现membershipprovider的主要功能。它们的定义如下:

namespace system.configuration.provider
{
 public interface iprovider
 {
  public string name { get; }
  public void initialize(string name,
  system.collections.specialized.namevaluecollection config);
 }
}

namespace system.web.security
{
 public interface imembershipprovider
 {
  public bool changepassword(string name, string oldpwd, string newpwd);
  public bool changepasswordquestionandanswer(string name, string password,
string newpwdquestion, string newpwdanswer);
  public system.web.security.membershipuser createuser(string username, string password, string email,out system.web.security.membershipcreatestatus status);
  public bool deleteuser(string name);
  public system.web.security.membershipusercollection getallusers();
  public int getnumberofusersonline();
  public string getpassword(string name, string answer);
  public system.web.security.membershipuser getuser(string name,bool userisonline);
  public string getusernamebyemail(string email);
  public string resetpassword(string name, string answer);
  public void updateuser(system.web.security.membershipuser user);
  public bool validateuser(string name, string password);
  public string applicationname {get; set;}
  public bool enablepasswordreset { get;}
  public bool enablepasswordretrieval { get;}
  public bool requiresquestionandanswer { get;}
 }

  现在可以动手来实现我们自己的membershipprovider了:

public class mymembershipprovider : iprovider, imembershipprovider
{
 ……

  验证功能是必需的:

public bool validateuser (string name, string password)
{
 string connectstr = configurationsettings.connectionstrings["portaldata"];
 sqlconnection myconnection = new sqlconnection (connectstr);
 sqlcommand mycommand = new sqlcommand ("userlogin", myconnection);
 mycommand.commandtype = commandtype.storedprocedure;

 // add parameters to sproc
 sqlparameter parameteremail = new sqlparameter ("@email", sqldbtype.nvarchar, 100);
 parameteremail.value = name;
 mycommand.parameters.add (parameteremail);

 sqlparameter parameterpassword = new sqlparameter ("@password", sqldbtype.nvarchar, 20);
 parameterpassword.value = password;
 mycommand.parameters.add (parameterpassword);

 sqlparameter parameterusername = new sqlparameter ("@username", sqldbtype.nvarchar, 100);
 parameterusername.direction = parameterdirection.output;
 mycommand.parameters.add (parameterusername);  

 // open the database connection and execute the command
 myconnection.open ();
 mycommand.executenonquery ();
 myconnection.close ();
 if ((parameterusername.value != null) && (parameterusername.value != system.dbnull.value))
  return true;
  return false;
}

 

  现在在web.config中可以这样配置connectionstring了:

<connectionstrings>

<add name="bugdepotdata" connectionstring="data source=(local);trusted_connection=true;database=portal" />

</connectionstrings> 

  这样,我们自己的一个简单的membershipprovider就基本上完成了。接下来需要配置web.config,让需要provider服务的控件能够认识它:

<membership>
 <providers>
  <add name="mymembershipprovider" type="mymembershipprovider" appname="/" />
 </providers>
</membership> 

  这段设置是参考machine.config而来的,其中type属性的值是这样的字符串:

type="providertype, assembly, version, culture, publickeytoken" 

  由于我们的mymembershipprovider放在/code目录下,并不是在单独的assembly中,因此只需要指出providertype就行了。

  这样,一个具有验证功能的provider就完成了,现在可以在页面上放一个新的security控件,比如login控件,并指定它的membershipproperty为mymembershipprovider(或者也可以设置membership的defaultprovider属性为mymembershipprovider),打开forms验证,试试是不是已经能够成功登陆了?

 本文TagsC#  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:使用函数传递参数来执行数据库操作
· 下一篇:在asp.net中为Web用户控件添加属性和事件
· 带你走进ASP.NET(2)
· .NET 共享对象类别库
· .NET之ASP Web Application快速入门(1)
· 简单对象协议(SOAP)简介
· url传递中文的解决方案


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077