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
41
42结果如图:
43
44
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]") && (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
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
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<</authentication></authorization></authentication></security>