ASP.NET Authentication Provider

ASP.NET Authentication Provider


小气的神 2001-12-20

Article Type: Overview

难度等级: 3/9

版本: 1.12

ASP.NET 提供了一些新型的 Authentication 和 Authorization 方案,对于开发人员来说这将是和以前不同的一种方式。可喜的是 ASP.NET 提供的方案多样更加灵活;可惜的是这种方案是基于 IIS 的。我知道,有些人并不喜欢 IIS ,认为它容易受攻击。只是一直不喜欢 ASP 的方式,杂乱的 HTML 标记中夹杂着代码,难于维护也难于调试。现在有了新的解决方案,让我们看看。

新型 ASP.NET Authentication Provider (下面我会用 ASP.NET AP 来简称)仅仅发生在调用 ASP.NET 引擎执行 .aspx 文件时发生,这也意味着当调用 .asp 文件时将不会调用 ASP.NET 引擎。所有的 Authentication 选项被放在一个 XML 文件中。每当你创建一个 ASP.NET 的 Project 时,你可以在 Project 目录下发现一个 Config.web 文件,在这个 XML 文件的

  1<security>, <authentication>, <authorization> 等标记中你可以进行设置和控制。默认的是:  <authentication mode="None"></authentication> ,这意味着  ASP.NET  将不使用任何的  Authentication Provider  ,那么这种模式下,  ASP.NET  的底层实现和原来的  ASP  和  IIS 4/5  将完全相同。 
  2
  3一个典型的  Config.web  的一般会是下面这样的: 
  4
  5<!--  AUTHENTICATION 
  6
  7This section sets the authentication policies of the application. Possible modes are "Windows", "Forms", "Passport" and "None" 
  8
  9\-->
 10<authentication mode="None"></authentication>
 11
 12我们会逐一的考察  <authentication> 中各个可能的值,不过作为一个开放人员最后我的重点会放在  ”Forms”  上,最后确定一下我们的平台环境:  W2K ADV , VS.NET RCx , IE 6  。  (VS.NET Beta2  应该也是可以的,因为写这篇文章时我的系统已从  Beta 2  上升级了,所以只能说  :  我想  Beta 2  也是可以的。不过我们不会讨论  mode=”Cookie”  的情况,这个标记只发生在  ASP+  的情况下,  Beta 2  之后的  ASP.NET  中应当没有了  )  ,然后我们还会使用到  SDK  中带的例子,因为简单所以可以是最好的一个起点。 
 13
 14然后我们需要简单的设置一下子,先建立一个目录  C:\Inetpub\wwwroot\Security  ,然后  Copy  原来  SDK  的  FrameworkSDK\Samples\QuickStart\aspplus\samples\security  中的文件到新建的目录中(也可以直接解压缩附带文件到这个目录中) 
 15
 16** 1.  Mode=”None”  **
 17
 18** **
 19
 20这种模式是默认的,像上面提到的那样  ,  它的行为和原来的  ASP  没有任何的不同。 
 21
 22但你使用  VS.NET  生成一个  ASP.NET  的  Project  时,这种模式是默认生成的。 
 23
 24** 2.  Mode=”Windows”  **
 25
 26** **
 27
 28这种模式下,我们所访问的每一个页面都将需要通过系统的  Authentication  ,访问者可能看到有些迷惑和  Windows  环境下特有的  Authentication  窗口  ,老实说我更喜欢看到  Window XP  下的,它更可爱一些。使用这种模式意味着你可以不用额外的写任何代码,很快的实现,但我想你的商业用户不会喜欢它,而且作为一个开发人员,你无法定制它。 
 29
 30现在你实现这种方式将会非常的简单。 
 31
 321.  在  Config.web  文件中设置  <authentication mode="Windows"></authentication>
 33
 342.  去  IIS  的控制管理界面设置你的  Application  属性就可以了。如下图: 
 35
 363.  然后访问你的页面,你会看到这个对话框,很有趣但绝对让非专业人士迷惑。 
 37
 384.  我们使用的是  WindowAuth  的页面。注意  Mode=” Windows”,  还没有先进到只用设置好  Mode=  就可以实现  Windows Authentication  了。 
 39
 40![Windows Setup ](http://vsdotnet.51.net/jpg/02010901.jpg)
 41
 42结果如图: 
 43
 44![显示结果](http://vsdotnet.51.net/jpg/02010902.jpg)
 45
 46** 3.  Mode=”Passport”  **
 47
 48** **
 49
 50对于这种模式下,  ASP.NET  引擎会使用  Microsoft Passport  的  Authentication  机制,理论上这种模式将是最  OK  和省力的,不过照目前看来,想在  ASP.NET  下实现  Passport  还不是一件轻松的事情,  VS.NET Beta 2  的类库并没有完全实现  Passport 2.1  的功能(  PassportIdentity  )  . Microsoft  目前唯一展示的是在  MSDN  上的  ColdStorage  例子,实现上基本基于  Passport 1.4  而且像使用  DirectX  一样,还需要专门的一个  DLL  。有资料显示  VS.NET RC2  之后的类库已经实现了原来未实现的功能,但就目前看来缺少这方面的资料,所以把这方面的信息留给  Microsoft  和  Passport 3.0  吧,以后的时间我们会再来考察,对于  Passport  我深有信心,而且只要在  Microsoft  平台,我们都可能无法逃避面对  Passport. 
 51
 52有关  ColdStorage  的  Passport  的信息,可以参见下面的文章: 
 53
 54http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncold/html/storageauthentication.asp 
 55
 56** 4.  Mode=”Forms”  **
 57
 58** **
 59
 60这种模式下,我想每个开放人员将获得最大的灵活性和控制,而且从现在看来,这是最实用和可行的一种方式。先看一个比较简单的例子: 
 61
 621\.  在  Config.Web  文件中进行下面的设置: 
 63
 64<authentication mode="Forms">
 65<forms loginurl="login.aspx" name=".ASPXUSERDEMO"></forms>
 66</authentication>
 67
 68loginUrl=”string”  表明未通过  Authentication  的请求将被定向到的页面,你可以自行设置。 
 69
 702\.  然后点击或在  login.aspx  文件的  Login  按钮的  Click  的事件处理程序中写入下面的代码: 
 71
 72void Login_Click(Object sender, EventArgs E) { 
 73
 74// authenticate user: this samples accepts only one user with 
 75
 76// a name of [email protected] and a password of 'ccBoy' 
 77
 78if ((UserEmail.Value == "[email protected]") &amp;&amp; (UserPass.Value == "ccBoy")) { 
 79
 80FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); 
 81
 82} 
 83
 84else { 
 85
 86Msg.Text = "Invalid Credentials: Please try again"; 
 87
 88} 
 89
 90} 
 91
 92这里我们使用的硬编码,  目前只允许  [email protected]  和  ccBoy  作为登录的用户。测试时我们并不直接访问  Login.aspx  而是请求  default.aspx  这个页面,  ASP.NET  使用其  Authentication  机制,将重新定向到  Login.aspx  ,当用户输入的信息被接受则返回最初请求的  default.aspx.  方式上由于我们使用  dotNET  的  WebUI  控件,更加对象化了,当判断通过  FormsAuthentication  执行  RedirectFromLoginPage  方法,这个函数发出  Cookie  ,并把用户重新定向到最初请求的资源。这种方式下  ASP.NET AP  做了一半的工作,事实上它是被动的完成  RedirectFromLoginPage 
 93
 94结果如图: 
 95
 96![Login](http://vsdotnet.51.net/jpg/02010903.jpg)
 97
 98下面我们修改  config.web  文件,使得  Authentication  从  config.web  中获得信息和发生 
 99
1001.  先设置  config.web  文件 
101
102<authentication mode="Forms">
103<forms loginurl="login.aspx" name=".ASPXUSERDEMO">
104<credentials passwordformat="Clear">
105<user name="[email protected]" password="ccboy"></user>
106</credentials>
107</forms>
108</authentication>
109<credentials></credentials> 中指定访问系统资源的用户名和密码,并且可以对加密的密码进行定制和管理(建议实际应用中不要将用户名和密码放在这里面) 
110
111Passwordformat  可以是“  Clear  ”、“  SHA1  ”、“  MD5  ”等值。 
112
113Clear  :用纯文本保存密码。用户和密码不需要进一步的转换可以直接使用和用户进行比较 
114
115SHA1  :用  SHA1  的哈希分类保存密码。验证时将用  SHA1  算法对用户密码进行散列,然后同该值进行比较。 
116
117MD5  :同  SHA1  类似,只是使用不同的算法。 
118
119当使用  SHA1  和  MD5  时还需要一个专门的  API  (  HashPasswordForStoringInConfigFile  )来执行加密  ,  然后结果因保存到  config.web  文件中。具体可以参考下面的链接: 
120
121http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp 
122
1232.  然后点击或在  login.aspx  文件的  Login  按钮的  Click  的事件处理程序中写入下面的代码: 
124
125void Login_Click(Object sender, EventArgs E) { 
126
127if ( FormsAuthentication.Authenticate( UserEmail.Value, UserPass.Value) ) 
128
129{ 
130
131FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); 
132
133} 
134
135else { 
136
137Msg.Text = "Invalid Credentials: Please try again"; 
138
139} 
140
141} 
142
143结果和上一个相同,但这次我们把判断交给了  ASP.NET AP ,  我们只传递了  UserEmail,UserPass  两个参数,  Authenticate  方法将完成  Authentication  过程,这个用户将和我们在  config.web  中  <user></user> 中设置的相同。 
144
145![Login Out](http://vsdotnet.51.net/jpg/02010904.jpg)
146
147MS  文档《  Forms Authentication Using An XML Users File  》展示了另外一种获取用户名和密码的方式,这种方式为了安全,用户和密码被放在一个单独的  XML  文件中。具体参考下面的链接: 
148
149http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp 
150
151同样的道理你可以象你以前做得一样将用户和密码放到数据库表中,比如: 
152
153void Login_Click(Object sender, EventArgs e) { 
154
155if(Page.IsValid) 
156
157{ 
158
159SQLDataReader dr; 
160
161&lt;</authentication></authorization></authentication></security>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus