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文件的<security>, <authentication>, <authorization>等标记中你可以进行设置和控制。默认的是:<authentication mode="none" />,这意味着asp.net将不使用任何的authentication provider,那么这种模式下,asp.net的底层实现和原来的asp和iis 4/5 将完全相同。
一个典型的config.web的一般会是下面这样的:
<!-- authentication
this section sets the authentication policies of the application. possible modes are "windows", "forms", "passport" and "none"
-->
<authentication mode="none" />
我们会逐一的考察<authentication>中各个可能的值,不过作为一个开放人员最后我的重点会放在”forms”上,最后确定一下我们的平台环境:w2k adv , vs.net rcx , ie 6 。(vs.net beta2 应该也是可以的,因为写这篇文章时我的系统已从beta 2上升级了,所以只能说:我想beta 2也是可以的。不过我们不会讨论mode=”cookie”的情况,这个标记只发生在asp+的情况下,beta 2之后的asp.net中应当没有了),然后我们还会使用到sdk中带的例子,因为简单所以可以是最好的一个起点。
然后我们需要简单的设置一下子,先建立一个目录c:/inetpub/wwwroot/security,然后copy原来sdk的frameworksdk/samples/quickstart/aspplus/samples/security中的文件到新建的目录中(也可以直接解压缩附带文件到这个目录中)
1. mode=”none”
这种模式是默认的,像上面提到的那样,它的行为和原来的asp没有任何的不同。
但你使用vs.net生成一个asp.net 的project时,这种模式是默认生成的。
2. mode=”windows”
这种模式下,我们所访问的每一个页面都将需要通过系统的authentication,访问者可能看到有些迷惑和windows环境下特有的authentication窗口 ,老实说我更喜欢看到 window xp下的,它更可爱一些。使用这种模式意味着你可以不用额外的写任何代码,很快的实现,但我想你的商业用户不会喜欢它,而且作为一个开发人员,你无法定制它。
现在你实现这种方式将会非常的简单。
1. 在config.web 文件中设置<authentication mode="windows" />
2. 去iis的控制管理界面设置你的application属性就可以了。如下图:
3. 然后访问你的页面,你会看到这个对话框,很有趣但绝对让非专业人士迷惑。
4. 我们使用的是windowauth的页面。注意mode=” windows”,还没有先进到只用设置好mode=就可以实现windows authentication了。
结果如图:
3. mode=”passport”
对于这种模式下,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.
有关coldstorage的passport的信息,可以参见下面的文章:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncold/html/storageauthentication.asp
4. mode=”forms”
这种模式下,我想每个开放人员将获得最大的灵活性和控制,而且从现在看来,这是最实用和可行的一种方式。先看一个比较简单的例子:
1. 在config.web 文件中进行下面的设置:
<authentication mode="forms">
<forms name=".aspxuserdemo" loginurl="login.aspx" />
</authentication>
loginurl=”string” 表明未通过authentication的请求将被定向到的页面,你可以自行设置。
2. 然后点击或在login.aspx 文件的login按钮的click的事件处理程序中写入下面的代码:
void login_click(object sender, eventargs e) {
// authenticate user: this samples accepts only one user with
// a name of [email protected] and a password of 'ccboy'
if ((useremail.value == "[email protected]") && (userpass.value == "ccboy")) {
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
}
else {
msg.text = "invalid credentials: please try again";
}
}
这里我们使用的硬编码,目前只允许[email protected] 和 ccboy作为登录的用户。测试时我们并不直接访问login.aspx而是请求default.aspx这个页面,asp.net使用其authentication机制,将重新定向到login.aspx,当用户输入的信息被接受则返回最初请求的default.aspx.方式上由于我们使用dotnet的webui控件,更加对象化了,当判断通过formsauthentication 执行redirectfromloginpage 方法,这个函数发出cookie,并把用户重新定向到最初请求的资源。这种方式下asp.net ap做了一半的工作,事实上它是被动的完成redirectfromloginpage
结果如图:
下面我们修改config.web文件,使得authentication 从config.web中获得信息和发生
1. 先设置config.web 文件
<authentication mode="forms">
<forms name=".aspxuserdemo" loginurl="login.aspx" >
<credentials passwordformat="clear">
<user name="[email protected]" password="ccboy"/>
</credentials>
</forms>
</authentication>
<credentials></credentials>中指定访问系统资源的用户名和密码,并且可以对加密的密码进行定制和管理(建议实际应用中不要将用户名和密码放在这里面)
passwordformat可以是“clear”、“sha1”、“md5”等值。
clear:用纯文本保存密码。用户和密码不需要进一步的转换可以直接使用和用户进行比较
sha1:用sha1的哈希分类保存密码。验证时将用sha1算法对用户密码进行散列,然后同该值进行比较。
md5:同sha1类似,只是使用不同的算法。
当使用sha1和md5时还需要一个专门的api(hashpasswordforstoringinconfigfile)来执行加密,然后结果因保存到config.web文件中。具体可以参考下面的链接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp
2. 然后点击或在login.aspx 文件的login按钮的click的事件处理程序中写入下面的代码:
void login_click(object sender, eventargs e) {
if ( formsauthentication.authenticate( useremail.value, userpass.value) )
{
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
}
else {
msg.text = "invalid credentials: please try again";
}
}
结果和上一个相同,但这次我们把判断交给了asp.net ap ,我们只传递了useremail,userpass两个参数,authenticate方法将完成authentication过程,这个用户将和我们在config.web中<user></user>中设置的相同。
ms文档《forms authentication using an xml users file》展示了另外一种获取用户名和密码的方式,这种方式为了安全,用户和密码被放在一个单独的xml文件中。具体参考下面的链接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguidnf/html/cpconformsauthenticationutilities.asp
同样的道理你可以象你以前做得一样将用户和密码放到数据库表中,比如:
void login_click(object sender, eventargs e) {
if(page.isvalid)
{
sqldatareader dr;
// connect to the database
sqlconnection cn = new sqlconnection("server=localhost;
uid=mypassport;pwd=123;database=clientpassword;");
cn.open();
// create a command to get the question
sqlcommand cmdquestion = new sqlcommand("select password;
from users where email = '" + useremail.value + "'", cn);
cmdquestion.execute(out dr);
if(dr.read())
if(dr["password"].tostring() == userpass.value)
formsauthentication.redirectfromloginpage(useremail.value, persistcookie.checked);
else
msg.text = "invalid password. please try again ";
else
msg.text = "email address not found.";
}
}
再同理可以推到这个过程也还可以是调用带有商业逻辑 .net 组件来完成,也可以是调用另外一个web services来完成,当从这个角度来说,已经和ms passport 有些相同了。相比起来microsoft的方式是重量级的。
5. mode=”mymode”
这将是以后我们要讨论的,asp.net 支持我们使用自己的ap来实现authentication 和 authorization 方案.这将是一种更高级的方式,事实上asp.net 比上一个版本更加的灵活和多样的选择。keith brown在11,12月的msdn magazine上都有讨论有关asp.net 的安全性问题。
综上所述,我们可以看到一个基本的有关asp.net authentication的情况,其好处是明显的,但如果你不喜欢iis其本身,那么你也将考虑使用其他的authentication方案。jeff kercher 的《asp .net 中的身份验证:.net 安全性指导》将可以作为你开始和深入的一个更宏观的执导。
http://www.microsoft.com/china/msdn/library/dnbda/html/authaspdotnet.asp
这篇文章具体讲述了各种验证方案的环境和优劣,从而协助你选择和确定最佳的身份验证方法。
新闻热点
疑难解答
图片精选