在APS.NET中用FORMS进行验证的问题?高手请进!100分送 这样做不是很好建议你用一个Login.ascx的用户控件来实现ASP.Net的编程不象以前的asp编程有很多特性你可以利用。多看看一些ASP.NET站点的书 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用WEB.CONFIG的FORMS验证,肯定是左右或上下两个页面都有了验证页面了。我是希望出现一个页面,或是出现另一个页面验证,都不行!如何解决呢?在一个大系统中用用户控件是不是太麻烦???能不能请楼上的小陈说说验证都可以用什么方法?转载验证方法:ASP.NET Authentication ProviderASP.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); cm 我想楼主的意思应该是:在用户未验证而直接访问受保护框架页时,程序返回到登录页,此时,框架页的每个页面都显示登录页吧,如果是这样,提供一个简单的方法给你: 在你的登录页如:login.aspx中加入:<script language=javascript> if (top.frames.length>0) top.window.location="login.aspx"; </script>即可。当首先进入login页时,因为不是框架页,此时,top.frames.length值为0,则不执行定位语句。(如果无此判断,则页面将陷入死循环)如首先进入受保护框架页,则将被导回login,此时:top.frames.length>0,定向到无框架的login页面。我是午睡前看了你的帖子,在睡觉时得的灵感哦:-),希望对你有所帮助。 (急)GridView中手写绑定数据,如何简单快速进行分页 请大家推荐本asp.net控件开发方面的书 跪求:asp.net中 同一行中的第一句话居中,第二句话居右 开源站点! 提交页面后后不能返回,如果在vs.net中加了断点,则在断点停留后,F5能返回,求解决方法 打开新闻的内容时出错? 怎样运行时锁定和解锁文本框? 用C#实现datalist绑定的问题 给新手的一些经验! C#中如何在HTML页面中引入命名空间? 为什么我给分的时候,说我输入的不是数字??? 大家有没有用过xsd.exe?谈谈心得
能不能请楼上的小陈说说验证都可以用什么方法?
转载验证方法:
ASP.NET Authentication ProviderASP.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);
cm
在你的登录页如:login.aspx中加入:
<script language=javascript>
if (top.frames.length>0)
top.window.location="login.aspx";
</script>
即可。
当首先进入login页时,因为不是框架页,此时,top.frames.length值为0,则不执行定位语句。(如果无此判断,则页面将陷入死循环)
如首先进入受保护框架页,则将被导回login,此时:top.frames.length>0,定向到无框架的login页面。
我是午睡前看了你的帖子,在睡觉时得的灵感哦:-),希望对你有所帮助。