为了完成演示分目录验证,我们在项目中添加一个User文件夹,并添加UserInfo.aspx、 UserLogin.aspx两个页面。UserInfo.aspx用来展示用户信息,它的业务逻辑我们不是我们关心的,UserLogin.aspx页面用来让用户登陆,代码跟Login.aspx页面几乎完全相同。
第一步:修改Web.config文件,允许匿名用户访问系统资源。
<authorization> <allow users="?"/> </authorization>
第二步:在User文件夹下添加一个Web.config文件,修改代码,拒绝匿名用户访问该文件夹下的资源。
<authorization> <deny users="?"/> </authorization>
完成这两步后,我们访问UserInfo.aspx时,如果没有登陆,则会被导航到~/User/UserLogin.aspx页面,当登陆后,又会被导航到~/User/UserInfo.aspx页面。这个时侯,我们的登陆页面样式并没有丢失,这说明我们的配置文件起作用了。
接下来,我们想在UserInfo.aspx页面中显示出已登陆用户的用户名和密码(这里完全是为了演示如何获取登陆用户数据才这样做的,通常用户的密码是不会展示的)。在进行登陆后,用户的票据信息被加密保存在Cookie中,这个票据中,有已登录用户的名称信息,我们通过获取票据中的用户名,即可获取到完整的用户信息。
为了显示用户信息,我们在页面中放置两个Label控件,代码如下:
<h2> <p>用户名:<asp:Label Text="" runat="server" /></p> <p>密 码:<asp:Label Text="" runat="server" /></p> </h2>
然后,我们在页面的Load方法中,获取并展示用户信息:
if (this.Context.User != null && this.Context.User.Identity != null && this.Context.User.Identity.IsAuthenticated) { SampleUser user = SampleUser.GetUser(this.Context.User.Identity.Name); if (user != null) { this.lblUserName.Text = user.UserName; this.lblUserPWD.Text = user.UserPWD; } }
再次运行我们的代码,当用户登陆后(如果保持登陆状态,即使关掉并重新打开浏览器),我们都可以获取到已登录用户的Name,从而获取用户的对象。
如果要退出登陆,我们只需要删除保存在Cookie中的票证信息即可,这个功能Forms验证已经帮我们完成,代码很简单:
FormsAuthentication.SignOut(); //退出登陆
在本文中,没有涉及到角色的验证,这是因为通过在配置文件中指定角色这种方法并不够灵活,如果角色是可以在程序中维护的,那么我们在这里的指定就形同虚设了。感兴趣的朋友可以自行学习,也并不复杂。在本文的结尾,附上详细的Forms验证在Web.config中的配置说明:
<forms loginUrl="URL" defaultUrl="URL" protection="[All|None|Encryption|Validation]" timeout="[MM]" path="path" requireSSL="[true|false]" slidingExpiration="[true|false]"> enableCrossAppRedirects="[true|false]" cookieless="[UseUri|UseCookie|AutoDetect|UseDeviceProfile]" domain="domain name" ticketCompatibilityMode="[Framework20|Framework40]"> <credentials>...</credentials> </forms>
name:指定要用于身份验证的 HTTP Cookie。如果正在一台服务器上运行多个应用程序并且每个应用程序都需要唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。默认值为 ".ASPXAUTH"。
loginUrl:指定如果找不到任何有效的身份验证 Cookie,将请求重定向到的用于登录的 URL。默认值为 login.aspx。
defaultUrl:定义在身份验证之后用于重定向的默认 URL。默认值为 "default.aspx"。
protection:指定 Cookie 使用的加密类型(如果有)。默认值为 All。
timeout:指定 Cookie 过期前逝去的时间(以整数分钟为单位)。如果 SlidingExpiration 属性为 true,则 timeout 属性是滑动值,会在接收到上一个请求之后的指定时间(以分钟为单位)后过期。 为防止危及性能并避免向开启 Cookie 警告的用户发出多个浏览器警告,当指定的时间逝去大半时将更新 Cookie。这可能导致精确性受损。默认值为 "30"(30 分钟)。
path:为应用程序发出的 Cookie 指定路径。默认值是斜杠 ( /),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。
requireSSL:指定是否需要 SSL 连接来传输身份验证 Cookie。默认值为 False。
slidingExpiration:指定是否启用可调过期时间。可调过期将 Cookie 的当前身份验证时间重置为在单个会话期间收到每个请求时过期。默认值为 True。
enableCrossAppRedirects:表明是否将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。默认值为 False。
cookieless:定义是否使用 Cookie 以及 Cookie 的行为。默认值为 UseDeviceProfile.
domain:指定在传出 Forms 身份验证 Cookie 中设置的可选域。此设置的优先级高于 httpCookies 元素中使用的域。默认值为空字符串 ("")。
ticketCompatibilityMode:指定在 Forms 身份验证中对于票证到期日期使用协调世界时 (UTC) 还是本地时间。默认值为 Framework20。
子元素 credentials:允许选择在配置文件中定义名称和密码凭据。您还可以实现自定义的密码架构,以使用外部源(如数据库)来控制验证。