请教Context的用法
请教Context的用法,如何利用他在页面之间传递数据,我说的并不是利用Session
还有Request.IsAuthenticatedt怎么样去验证用户,Context.Items
在提问之前我有看过一些这方面的东东,但是使终还是不明白.比如说.有这样一段代码
if (Request.IsAuthenticated == true) {
WelcomeMessage.Text = "欢迎" +
Context.User.Identity.Name + "!<" +
"span class=Accent" + ">|<" + "/span" + ">";
// 如果身份验证模式为 Cookie,则提供一个注销链接
if (Context.User.Identity.AuthenticationType == "Forms") {
LogoffLink = "<" + "span class=\"Accent\">|</span>\n" +
"<a href=" + Request.ApplicationPath +
"/Admin/Logoff.aspx class=SiteLink> 注销" +
"</a>";
}
}
我实在无理解其中的代码Request.IsAuthenticated == true
这段代码是在验证用户,但是他们的数据从哪里得来了,比方说如果有一登录程序他是验证和数据库的信息是否相等,但是我看这段代码,不知道他到底在验证什么,只知道是在验证用户,那他做比较的用户数据从哪里来了.然后就是Context.User.Identity.AuthenticationType == "Forms"我是想了半天也不明白其中的道理.
问题点数:100、回复次数:11Top
1 楼bestfuture(美好未来.NET(CRM))回复于 2004-08-01 06:49:20 得分 0
upTop
2 楼devfan(小星)回复于 2004-08-01 07:23:32 得分 0
Request.IsAuthenticated == true
判断验证过的用户
当建立验证票的时候验证的数据就保存在客户端的Cookie中,每次请求都会从客户端传输验证的数据,也就是如果禁止Cookie就不能进行Forms验证
Context.User.Identity.AuthenticationType == "Forms"
说明验证的方式是Forms,而不是其他的如 "windows"Top
3 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2004-08-01 08:41:50 得分 20
使用Forms身份验证时,如果被验证的用户通过验证,必须用FormsAuthentication.RedirectFromLoginPage或者FormsAuthentication.SetAuthCookie方法将用户的身份验证票保存到Cookie中,Request.IsAuthenticated属性就是检查这个身份验证票是否存在,若存在则返回true(用户已通过验证),否则返回false(用户未通过验证)。Context.User.Identity.Name获取的就是身份验证票中保存的用户的登录名。Top
4 楼fsonly(FSG)回复于 2004-08-01 08:43:51 得分 10
用的是“Forms”验证方式,三种认证方式之一。
至于Context是Http当前的响应对像,这样在任何地方可以直接使用HttpContext相关的类
而不用继承自Web.PageTop
5 楼goody9807(http://goody9807.cnblogs.com)回复于 2004-08-01 09:21:07 得分 30
HttpContext 概述
公共构造函数
HttpContext 构造函数 已重载。初始化 HttpContext 类的新实例。
公共属性
AllErrors 获取在处理 HTTP 请求的过程中累积的错误数组。
Application 为当前 HTTP 请求获取 HttpApplicationState 对象。
ApplicationInstance 为当前 HTTP 请求获取或设置 HttpApplication 对象。
Cache 为当前 HTTP 请求获取 Cache 对象。
Current 为当前 HTTP 请求获取 HttpContext 对象。
Error 获取在处理 HTTP 请求的过程中累积的第一个错误(如果有)。
Handler 为当前 HTTP 请求获取或设置 IHttpHandler 对象。
IsCustomErrorEnabled 获取一个值,该值指示是否已为当前 HTTP 请求启用自定义错误。
IsDebuggingEnabled 获取一个值,该值指示当前 HTTP 请求是否处于调试模式。
Items 获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值集合。
Request 为当前 HTTP 请求获取 HttpRequest 对象。
Response 为当前 HTTP 响应获取 HttpResponse 对象。
Server 获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。
Session 为当前 HTTP 请求获取 HttpSessionState 实例。
SkipAuthorization 获取或设置一个值,该值指定 URLAuthorization 模块是否将跳过对当前请求的授权检查。
Timestamp 获取当前 HTTP 请求的初始时间戳。
Trace 为当前 HTTP 响应获取 TraceContext 对象。
User 为当前 HTTP 请求获取或设置安全信息。
Top
6 楼qish69(01军团)回复于 2004-08-01 16:15:12 得分 0
关于身份验证的使用不知能否请各位大侠举拿一段具体一点代码来看看.上面虽然都说了,但是个人认为最好有一段这样的代码,才能更好的理解.
谢谢Top
7 楼devfan(小星)回复于 2004-08-01 18:17:58 得分 40
Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活。
Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。服务端上的授权设置就可以根据不同目录对不同用户的访问授权进行控制了。
下面大概的看一下Forms的过程。
Forms身份验证基本原理:
一 身份验证
要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置:
<authentication mode="forms">
<forms name=".ASPXAUTH " loginUrl="/login.aspx" timeout="30" path= "/">
</forms>
</authentication>
其中<authentication mode= "forms"> 表示本应用程序采用Forms验证方式。
1. <forms>标签中的name表示指定要用于身份验证的 HTTP Cookie。默认情况下,name 的值是 .ASPXAUTH。采用此种方式验证用户后,以此用户的信息建立一个FormsAuthenticationTicket类型的身份验证票,再加密序列化为一个字符串,最后将这个字符串写到客户端的name指定名字的Cookie中.一旦这个Cookie写到客户端后,此用户再次访问这个web应用时会将连同Cookie一起发送到服务端,服务端将会知道此用户是已经验证过的.
再看一下身份验证票都包含哪些信息呢,我们看一下FormsAuthenticationTicket类:
CookiePath: 返回发出 Cookie 的路径。注意,窗体的路径设置为 /。由于窗体区分大小写,这是为了防止站点中的 URL 的大小写不一致而采取的一种保护措施。这在刷新 Cookie 时使用
Expiration: 获取 Cookie 过期的日期/时间。
IsPersistent: 如果已发出持久的 Cookie,则返回 true。否则,身份验证 Cookie 将限制在浏览器生命周期范围内。
IssueDate: 获取最初发出 Cookie 的日期/时间。
Name: 获取与身份验证 Cookie 关联的用户名。
UserData :获取存储在 Cookie 中的应用程序定义字符串。
Version: 返回字节版本号供将来使用。
2. <forms>标签中的loginUrl指定如果没有找到任何有效的身份验证 Cookie,为登录将请求重定向到的 URL。默认值为 default.aspx。loginUrl指定的页面就是用来验证用户身份的,一般此页面提供用户输入用户名和密码,用户提交后由程序来根据自己的需要来验证用户的合法性(大多情况是将用户输入信息同数据库中的用户表进行比较),如果验证用户有效,则生成同此用户对应的身份验证票,写到客户端的Cookie,最后将浏览器重定向到用户初试请求的页面.一般是用FormsAuthentication.RedirectFromLoginPage 方法来完成生成身份验证票,写回客户端,浏览器重定向等一系列的动作.
public static void RedirectFromLoginPage( string userName, bool createPersistentCookie, string strCookiePath );
其中:
userName: 就是此用户的标示,用来标志此用户的唯一标示,不一定要映射到用户账户名称.
createPersistentCookie: 标示是否发出持久的 Cookie。
若不是持久Cookie,Cookie的有效期Expiration属性有当前时间加上web.config中timeout的时间,每次请求页面时,在验证身份过程中,会判断是否过了有效期的一半,要是的话更新一次cookie的有效期;若是持久cookie,Expiration属性无意义,这时身份验证票的有效期有cookie的Expires决定,RedirectFromLoginPage方法给Expires属性设定的是50年有效期。
strCookiePath: 标示将生成的Cookie的写到客户端的路径,身份验证票中保存这个路径是在刷新身份验证票Cookie时使用(这也是生成Cookie的Path),若没有strCookiePath 参数,则使用web.config中 path属性的设置。
这里可以看到,此方法参数只有三个,而身份验证票的属性有七个,不足的四个参数是这么来的:
IssueDate: Cookie发出时间由当前时间得出,
Expiration:过期时间由当前时间和下面要说的<forms>标签中timeout参数算出。此参数对非持久性cookie有意义。
UserData: 这个属性可以用应用程序写入一些用户定义的数据,此方法没有用到这个属性,只是简单的将此属性置为空字符串,请注意此属性,在后面我们将要使用到这个属性。
Version: 版本号由系统自动提供.
RedirectFromLoginPage方法生成生成身份验证票后,会调用FormsAuthentication.Encrypt 方法,将身份验证票加密为字符串,这个字符串将会是以.ASPXAUTH为名字的一个Cookie的值。这个Cookie的其它属性的生成:Domain,Path属性为确省值,Expires视createPersistentCookie参数而定,若是持久cookie,Expires设为50年以后过期;若是非持久cookie,Expires属性不设置。
生成身份验证Cookie后,将此Cookie加入到Response.Cookies中,等待发送到客户端。
最后RedirectFromLoginPage方法调用FormsAuthentication.GetRedirectUrl 方法获取到用户原先请求的页面,重定向到这个页面。
3. <forms>标签中的timeout和path,是提供了身份验证票写入到Cookie过期时间和默认路径。
以上就是基于Forms身份验证的过程,它完成了对用户身份的确认。下面介绍基于Forms身份验证的访问授权。
二 访问授权
验证了身份,是要使用这个身份,根据不同的身份我们可以进行不同的操作,处理,最常见的就是对不同的身份进行不同的授权,Forms验证就提供这样的功能。Forms授权是基于目录的,可以针对某个目录来设置访问权限,比如,这些用户可以访问这个目录,那些用户不能访问这个目录。
同样,授权设置是在你要控制的那个目录下的web.config文件中来设置:
<authorization>
<allow users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />
<deny users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />
</authorization>
<allow>标签表示允许访问,其中的属性
1. users:一个逗号分隔的用户名列表,这些用户名已被授予对资源的访问权限。问号 (?) 允许匿名用户;星号 (*) 允许所有用户。
2. roles:一个逗号分隔的角色列表,这些角色已被授予对资源的访问权限。
3. verbs:一个逗号分隔的 HTTP 传输方法列表,这些 HTTP 传输方法已被授予对资源的访问权限。注册到 ASP.NET 的谓词为 GET、HEAD、POST 和 DEBUG。
<deny>标签表示不允许访问。其中的属性同上面的。
在运行时,授权模块迭代通过 <allow> 和 <deny> 标记,直到它找到适合特定用户的第一个访问规则。然后,它根据找到的第一项访问规则是 <allow> 还是 <deny> 规则来允许或拒绝对 URL 资源的访问。Machine.config 文件中的默认身份验证规则是 <allow users="*"/>,因此除非另行配置,否则在默认情况下会允许访问。
Top
8 楼qish69(01军团)回复于 2004-08-01 23:38:31 得分 0
楼上的这位兄弟,你给出的回复其实我已在论坛中找到,
其实就关于身份验证的贴子我看了很多,其中明白了一些,但是就是一些关键性的东东还是不明白.比方说在web.config里配置了哪个用户可以访问那些资源,那为什么还要有一个角色的概念了..下面我贴出一段在论坛里找出来的一段有代表性的身份验证
web.config文件
<authentication mode="forms">
<forms name=".ASPXAUTH " loginUrl="/login.aspx"
timeout="30" path."/">
</forms>
</authentication>
C#代码
private void Buttonlogin_Click(object sender, System.EventArgs e)
{
string user = TextBoxUser.Text; //读取用户名
string password = TextBoxPassword.Text; //读取密码
if(Confirm(user,password) == true) //confirm方法用
来验证用户合法性的
{
string userRoles = UserToRole(user); //调用
UserToRole方法来获取role字符串
FormsAuthenticationTicket Ticket = new
FormsAuthenticationTicket (1,user,DateTime.Now,
DateTime.Now.AddMinutes(30), false,userRoles,"/") ; //建
立身份验证票对象
string HashTicket = FormsAuthentication.Encrypt
(Ticket) ; //加密序列化验证票为字符串
HttpCookie UserCookie = new
HttpCookie(FormsAuthentication.FormsCookieName,
HashTicket) ;
//生成Cookie
Context.Response.Cookies.Add (UserCookie) ; //
输出Cookie
Context.Response.Redirect
(Context.Request["ReturnUrl"]) ; // 重定向到用户申请的初
始页面
}
else
{
// 用户身份未被确认时的代码
}
}
//此方法用来验证用户合法性的
private bool Confirm(string user,string password)
{
//相应的代码
}
//此方法用来获得的用户对应的所有的role用逗号分割的一个字
符串
private string UserToRole(string user)
{
//相应的代码
}
在以上代码中我不能理解的是如果UserToRole()是提出对应数据表里用户是属于哪个角色的字符串,那么我们怎么知道这个角色对这个资源有访问权限....是通过web.config 但是上面并没有给出能访问的角色字符串来啊~!
然后在web.config里不是有一个name的属性吗?,他是设置程序中对应的cookie的名称的,但是我在上面的这段C#的代码中并没找到这个名子啊~!可能是我对上那段代码有错的理解吧~!~!
我本是一个ASP.NET的初学者,或者有的时候对提问的方式没有撑握好.希望坛子的的朋友,兄弟不要见意,也希望高手们能尽量理解我的意思,并给出出色的回答,最后能附上一个典型的实例代码(验证一个从数据库提出来的用户是否对某个资源有访问权,有的话就进入,没有就回到原页).........
对于此问题我只求找到一个答案,我会不断的为些贴加分,只能有哪位高手帮忙解开我心中的不解为止.
Top
9 楼qish69(01军团)回复于 2004-08-02 15:34:03 得分 0
怎以好像没有人看此贴啊~!
up
顶上去.Top
10 楼qish69(01军团)回复于 2004-08-02 15:34:20 得分 0
upTop
11 楼webdiyer(.net资源精华—www.dotneturls.com)回复于 2004-08-02 15:46:40 得分 0
楼主可以到http://www.asp.net去下载一个官方论坛看看它的源代码中身份认证部分,看过后应该就懂了。Top




