在进行Forms身份验证时如何将此信息映射到GenericPrincipal 和 FormsIdentity 对象?
此过程创建一个新的 ASP.NET Web 应用程序。此应用程序将包含两个页;一个是只允许经过身份验证的用户访问的默认页,另一个是用于收集用户凭据的登录页。
要创建一个有登录页的 Web 应用程序,请执行下列操作:
1.启动 Visual Studio .NET 并创建一个名为 test 的新 Visual C# ASP.NET Web 应用程序。
2.将 WebForm1.aspx 重命名为 Logon.aspx。
3.将下列控件添加到 Logon.aspx 来创建登录窗体。
2protected System.Web.UI.WebControls.TextBox txtPassword;
3protected System.Web.UI.WebControls.Button Button1;
在解决方案资源管理器中,然后单击 Add Web Form,输入 default.aspx 作为新窗体的名称,然后单击 Open.
配置 Web 应用程序进行 Forms 身份验证
要通过编辑应用程序的 Web.config 文件来配置应用程序进行 Forms 身份验证,请执行下列操作:
1.使用解决方案资源管理器打开 Web.config。
2.定位到 <authentication> 元素并将 mode 属性更改为 Forms。
3.将下列 <forms> 元素作为 <authentication> 元素的子元素进行添加,并设置 loginUrl、name、timeout 和 path 属性,如下所示:
<authentication mode="Forms">
<forms loginUrl="logon.aspx" name="AuthCookie" timeout="60" path="/">
</forms>
</authentication>
4.将下列 <authorization> 元素添加到 <authentication> 元素下。执行这一步的目的是只允许经过身份验证的用户访问应用程序。前面建立的 <authentication> 元素的 loginUrl 属性将未经过身份验证的请求重定向到 Logon.aspx 页。
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
为经过身份验证的用户生成身份验证票
此过程编写代码来为经过身份验证的用户生成身份验证票。身份验证票是由 ASP.NET FormsAuthenticationModule 使用的一种 cookie身份认证代码通常涉及到根据自定义数据库或 Active Directory 查找所提供的用户名和密码。
要为经过身份验证的用户生成身份验证票,请执行下列操作:
1打开 Logon.aspx.cs 文件并将下列 using 语句添加到位于文件顶部的现有 using 语句下:
2.将下列私有 Helper 方法添加到名为 IsAuthenticated 的 WebForm1 类中,此类用于验证用户名和密码来对用户进行身份验证。此代码假定所有用户名和密码组合都是有效的。
{
return true;
}
3.添加下列名为 GetRoles 的私有 Helper 方法,此方法用于获得用户所属的角色的集合
2{
3return "Senior Manager|Manager|Employee";
4}
4.在 Designer 模式下显示 Logon.aspx 窗体并双击 Logon 按钮创建一个单击事件处理程序。
5.添加一个对 IsAuthenticated 方法的调用,提供通过登录窗体捕获的用户名和密码。将返回值赋给一个 bool 类型的变量,此变量指出用户是否已经过身份验证。
6.如果用户已经过身份验证,则添加对 GetRoles 方法的调用来获得用户的角色列表。
{
string roles = GetRoles( txtUserName.Text, txtPassword.Text );
7.创建一个包含用户名、截止时间和用户所属的角色列表的新窗体身份验证票。注意,身份验证票的用户数据属性用于存储用户的角色列表。还要注意,虽然票 /cookie 是否是永久性的取决于您采用的应用程序方案,但下列代码会创建一个非永久性票
1, // version
txtUserName.Text, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(60),// Expiration
false, // Persistent
roles );
8.添加代码来创建票的加密字符串表示形式,并将其作为数据存储在 HttpCookie 对象中。
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);
9.将此 cookie 添加到返回给用户浏览器的 cookie 集合中。
10.将用户重定向到最初请求的页
//userName 已验证的用户的名称。这不必映射到 Windows 帐户。
//createPersistentCookie 指定是否应当发出持久性 Cookie(跨浏览器会话保存的 Cookie,Cookie 路径默认为“/”。
Response.Redirect( FormsAuthentication.GetRedirectUrl(txtUserName.Text,false ));
构造 GenericPrincipal 和 FormsIdentity 对象
此过程实现了一个应用程序身份验证事件处理程序,并根据身份验证票中包含的信息构造了 GenericPrincipal 和 FormsIdentity 对象。
要构造 GenericPrincipal 和 FormsIdentity 对象,请执行下列操作:
1.从解决方案资源管理器中,打开 global.asax。
2.切换到代码视图并将下列 using 语句添加到文件顶部:
3.定位到 Application_AuthenticateRequest 事件处理程序并添加下列代码,以从随请求传递的 cookie 集合中获得窗体身份验证 cookie
4.添加下列代码以从窗体身份验证 cookie 中提取和解密身份验证票。
5.添加下列代码,以便解析出用户在最初对用户进行身份验证时附加到票上的管道分隔的角色名称列表
6.添加下列代码来创建一个 FormsIdentity 对象和一个 GenericPrincipal 对象。前一个对象从票名称获得用户名,后一个对象将此标识与用户角色列表包含在一起。
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch(Exception ex)
{
return;
}
if (null == authTicket)
{
return;
}
string[] roles = authTicket.UserData.Split(new char[]{'|'});
FormsIdentity id = new FormsIdentity( authTicket );
GenericPrincipal principal = new GenericPrincipal(id, roles);
Context.User = principal;
测试应用程序
此过程将代码添加到 default.aspx 页以显示已附加到当前 HttpContext 对象的 GenericPrincipal 对象中的信息,目的是确认此对象是否已正确构造且分配给当前的 Web 请求。然后,可以生成并测试此应用程序。
要测试应用程序,请执行下列操作:
1.在解决方案资源管理器中,双击 default.aspx。
2.双击 default.aspx Web 窗体来显示页加载事件处理程序。
3.滚动到文件顶部并将下列 using 语句添加到现有 using 语句下。
4.返回到页加载事件处理程序并添加下列代码,以显示附加到与当前 Web 请求关联的 GenericPrincipal 的标识名称
5.添加下列代码以测试当前经过身份验证的标识的角色成员关系。
6.在解决方案资源管理器中,右键单击 default.aspx,然后单击 Set As Start Page。
7.在 Build 菜单上,单击 Build Solution。消除任何生成错误。
8.按 Ctrl+F5 运行此应用程序。由于 default.aspx 被配置为启动页,所以这是最初请求的页。
9.当您被重定向到登录页时(因为最初您没有身份验证票),输入用户名和密码(可随意输入),然后单击 Logon。
10.确认您被重定向到 default.aspx 且显示了用户标识和正确的角色详细信息。用户应为 Senior Manager、Manager 和 Employee 角色的成员,但不是 Sales 角色的成员。
private void Page_Load(object sender, System.EventArgs e)
{
IPrincipal p = HttpContext.Current.User;
Response.Write( "Authenticated Identity is: " +p.Identity.Name );
Response.Write( "<p>" );
if ( p.IsInRole("Senior Manager") )
Response.Write( "User is in Senior Manager role<p>" );
else
Response.Write( "User is not in Senior Manager role<p>" );
if ( p.IsInRole("Manager") )
Response.Write( "User is in Manager role<p>" );
else
Response.Write( "User is not in Manager role<p>" );
if ( p.IsInRole("Employee") )
Response.Write( "User is in Employee role<p>" );
else
Response.Write( "User is not in Employee role<p>" );
if ( p.IsInRole("Sales") )
Response.Write( "User is in Sales role<p>" );
else
Response.Write( "User is not in Sales role<p>" );
}
在进行Forms身份验证时如何将此信息映射到GenericPrincipal 和 FormsIdentity 对象?相关推荐
- 为不同目录设置Forms身份验证
在进行Forms身份验证时,如果采用如下的方法配置web.config的话,则会出现所有的页面都要进行验证,这是用户所不能容忍的,具体代码如下: 1<authentication mode=&q ...
- .net Forms身份验证不能用在应用的分布式部署中吗?
参照网上的一些方法,使用Forms身份验证对应用进行分布式部署,发现没有成功. 应用部署的两台内网服务器:192.168.1.19,192.168.1.87,使用Nginx做负载分配,配置完全相同:每 ...
- [转][.NET 基于角色安全性验证] 之三:ASP.NET Forms 身份验证
在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数. 2. 创建登录页. 登录页中的操作包括: 1. 验证用户名和密码是否正确. 2. 创建身份 ...
- .NET Forms身份验证
.NET表单身份验证 ASP.NET Forms 身份验证的简单实现:1)在Web.config文件中配置应用程序使用 Forms 身份验证:2)创建登陆页面,将用户身份验证票证添加到Cookie集合 ...
- Forms身份验证基本原理
要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置: <authentication mode="forms"> <fo ...
- asp.net Forms身份验证
Web.config中的配置 <system.web> <authentication mode="Forms"> <forms name=" ...
- 实现基于 ASP.NET Forms 身份验证的跨子域单点登录
对于跨应用程序的 ASP.NET Forms 身份验证,相信大家应该都不陌生,几年前很多文章都介绍了如何实现,比如 MSDN 的 跨应用程序进行 Forms 身份验证,唐朝程序员 的 ASP.NET站 ...
- forms身份验证 不跳转_Django用户身份验证实战
在这篇Django文章中,我们 将讨论Django User 验证,Django附带了一个用户认证系统.它处理用户帐户,组,权限和基于cookie的用户会话.Django身份验证系统同时处理身份验证和 ...
- java ntlm解密_java – HttpClient 4.1.1在使用NTLM进行身份验证时返回401,浏览器工作正常...
我正在尝试使用Apache / Jakarta HttpClient 4.1.1使用给定的凭据连接到任意网页.为了测试这一点,我在运行的dev机器上安装了最少的IIS 7.5,其中一次只有一种身份验证 ...
- forms 身份验证(授权)详解
首先在 web.config 中设置 <authentication mode="Forms">设置 mode="Forms" <form ...
最新文章
- 无空头链表详解(增删改查)
- hadoop学习5 搭建storm集群
- 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
- 线性代数的本质笔记-更新ing
- getHandel redis_Controller层利用Redis实现分布式锁(注解实现)
- 实时获取麦克风语音信号
- java继承中的初始化顺序
- Spring 加载Bean流程
- 简单电话系统的电话数量分析
- 电脑装机人员、管理软件安装实施人员必备工具包使用教程汇总值得收藏
- 计算机组成原理强制类型转换规则,计算机组成原理——浮点数加减运算强制类型转换...
- 制作ext4文件系统
- python快速搭建服务器方法
- linux分配oracle内存,【学习笔记】Linux系统 ORACLE用户进程占用私有内存分析
- Excel - 透视表 - 组合 分组
- 线程的终止的4种方式
- 转:一位10年Java工作经验的架构师聊Java和工作经验
- 清理谷歌浏览器注册表_win10注册表chrome残留无法删除如何解决
- CC2530F256RHAR 射频芯片 无线收发器芯片 ZigBee 解决方案
- 对菜鸟开发者的叮咛:花一万个小时练习 Coding,不要浪费一万小时无谓地 Debugging
热门文章
- No package ‘libpeas-1.0‘ found/No package ‘libpeas-gtk-1.0‘
- 没有方案你抱怨;有了方案你会认真看吗?
- bash: dh_make:未找到命令
- 总感觉这个访问量过于均匀……
- make指定输出目录
- LINUX下载编译FriBidi
- 手枪射击不准,远超想象,5米就完全没准头
- 订个票,显示吾是何等的脑残
- jsp点击按钮弹出输入框_【问答3】需要点击虚拟键盘上发送(搜索)按钮的写法...
- .net 编译工具_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实