欢迎光临
我们一直在努力

在Whidbey中实现Provider-.NET教程,评论及其它

建站超值云服务器,限时71元/月

本文由sam1111授权aspcool.com发表,未经作者许可,严禁转载。
  
  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验证,试试是不是已经能够成功登陆了?j

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在Whidbey中实现Provider-.NET教程,评论及其它
分享到: 更多 (0)