ASP.NET Authentication Provider

转载 2012年03月29日 23:19:31

http://ask.people.com.cn/ask/question.php?tid=1009&id=426506

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 new2001@msn.com and a password of ’ccBoy’ 



if ((UserEmail.Value == "new2001@msn.com") && (UserPass.Value == "ccBoy")) { 

FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked); 



else { 

Msg.Text = "Invalid Credentials: Please try again"; 







这里我们使用的硬编码,目前只允许new2001@msn.com 和 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="ccBoy@msn.com" 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 

这篇文章具体讲述了各种验证方案的环境和优劣,从而协助你选择和确定最佳的身份验证方法。 

相关文章推荐

(待翻译)Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication

IIS and ASP.NET Processing Note   The information in this section applies to Internet Information...

ASP.NET authentication and authorization

关于Authentication和Authorization的入门级介绍。 Introduction This article will discuss how to implement ASP.NE...

ASP.NET Forms Authentication所生成Cookie的安全性

asp.net forms authentication所生成cookie的安全性 我做这个实验是因为http://community.csdn.net/expert/topic/3927/3927...

Asp.net MVC Form authentication 示例代码

[HttpPost] public ActionResult LogOn(User model, string returnUrl) { if ...

(待翻译)Authentication Filters in ASP.NET Web API 2

An authentication filter is a component that authenticates an HTTP request. Web API 2 and MVC 5 both...

ASP.NET Identity Authentication

ASP.NET 认证与授权机制从基本的Form认证到后来的Membership认证,为ASP.NET应用构建了一个关于认证与授权的解决方案,开发者可以方便快捷地使用这个框架去解决应用认证与授权的问题....

ASP.NET Security Provider实现(五)ProfileProvider

System.Web.Profile.ProfileProvider类 定义 ASP.NET 为使用自定义配置文件提供程序提供配置文件服务而实现的协定。 继承层次结构: System.O...

ASP.net provider

  • 2011年07月25日 11:18
  • 7KB
  • 下载

ASP.NET Provider Model.pdf

  • 2016年12月14日 11:28
  • 606KB
  • 下载

ASP.NET Form Authentication - Form Authentication With Directory

1.背景 之前写过一篇关于ASP.NET Form认证与授权相关的博客,介绍了Form认证的基本原理,演示了如果做Form认证。这种认证方式其实是有很大的局限性的: 1)对于企业应用,不需要授权即...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET Authentication Provider
举报原因:
原因补充:

(最多只允许输入30个字)