表单身份验证!入门






2.87/5 (13投票s)
Forms 身份验证及其实际用法简介。
引言
本文旨在介绍 ASP.NET 中身份验证和授权的初学者。在此,我将尝试展示如何使用 Forms 身份验证及相关的授权,通过这些我可以拒绝未经授权的用户访问我的安全页面。
背景
ASP.NET 提供四种身份验证类型
Windows (默认)
表单
Passport
无
在这里,我将着重探讨 Forms 身份验证。
关注点
在开始之前,我想先解释一下身份验证和授权。
身份验证是一种识别用户的机制。识别用户称为身份验证;无论是将用户凭据存储在数据库、配置文件中,还是可能存储在域的 Active Directory 中。
另一方面,授权则解释了“哪个用户可以访问特定资源”。因此,在某些情况下,用户可能已通过身份验证但仍无法访问资源。
让我们通过一个实际问题来阐明这一点。假设您正在开发一个包含五个网页的 Web 应用程序。其中两个网页(登录和用户注册)应该对所有用户(包括匿名用户)开放,以便他们可以注册并登录其帐户。其他三个页面仅对已通过身份验证且获得授权的用户开放。因此,登录页面将验证用户,如果用户已通过身份验证并获得访问安全页面的授权,那么他/她将被重定向到那里。所以,让我们看看 Forms 身份验证将如何实现这一点(这里我只将使用两个页面;一个用于登录,另一个作为用户登录后的主页)。
启动您的 Studio 2005;创建一个名为“MyAuthentication”的新网站。在解决方案资源管理器中将“Default.aspx”页面重命名为 Login.aspx。现在,在应用程序名称上,添加一个 Web 配置文件。在 web.config 文件中,默认情况下,您会在 Authentication 标记中找到以下代码。
<authentication mode="Windows" />
现在,请删除此代码,并替换为以下内容
<authentication mode="Forms"> <forms loginUrl="Login.aspx" defaultUrl="./SecurePages/MyHome.aspx" path="/" protection="All" timeout="20"> <credentials passwordFormat="Clear"> <user name="kittu" password="tannu"/> <user name="kamal.singh" password="kharayat"/> </credentials> </forms> </authentication> <authorization> <allow users="*"/> </authorization>
我们将身份验证模式更改为“Forms”;这意味着将由表单来验证用户。现在 <forms> 标签接受许多参数,但我们感兴趣的是 loginurl、path 和 protection。Loginurl 是用户尝试访问安全页面时将被重定向到的页面。如果用户已通过身份验证并获得该资源的授权,则他/她将被重定向到所需的页面。DefaultUrl 是用户未请求特定页面并登录时将被重定向到的 URL。Path 将指定登录页面在层级结构中的位置。
在 forms 标签内,您可以编写 credentials 标签,如果您想将用户凭据存储在 web.config 文件中。坦率地说,在配置文件中存储凭据并不实用。所以,让我们将其存储在数据库表中,为此您无需编写 credentials 标签。
现在您必须知道,此配置文件位于应用程序的根目录,并将影响根目录中的所有对象。我们的登录页面也位于层级结构的根目录,我们希望所有人都能访问此登录页面。为此,在 authorization 部分,我们必须允许所有人,如上所示。
现在创建一个名为“SecurePages”的文件夹,并将一个名为“MyHome.aspx”的页面放入其中。该页面仅在用户成功登录后才应显示。为了保护此页面,请在其中放置一个 web.config 文件。并在 web.config 文件的 authorization 部分编写以下代码。
<authorization> <deny users="?"/> </authorization>
重要
让我告诉您,每个 web.config 文件都会覆盖其上方层级结构中 web.config 文件的设置。因此,我们将覆盖的任何设置都将适用于当前目录,即“SecurePages”。例如,在这里我们正在覆盖该目录的授权。但请记住一件事,您不能在每个 web.config 文件中反复验证用户。是的……但是您可以一次又一次地为不同的资源授权用户。
实现
因此,现在您的 MyHome.aspx 将不会被所有人直接访问,因为我们已拒绝匿名用户访问此资源。当任何用户尝试访问“Secure Pages”内的资源时,他/她将被重定向到登录页面,如果用户有效,他/她将获得访问权限。
现在让我们看看登录按钮单击时所需的代码
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnSubmit_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection("Data Source=ServerName; Initial Catalog=MyTesting; Integrated Security=true;"); SqlCommand cmd = new SqlCommand(); cmd.Parameters.AddWithValue("@UserName", txtUname.Text.Trim()); cmd.Parameters.AddWithValue("@Password", txtPword.Text.Trim()); cmd.CommandText = "Select * from Login where UserID=@UserName and Password=@Password"; cmd.Connection = con; SqlDataReader dr; con.Open(); dr = cmd.ExecuteReader(); if (dr.Read()) { FormsAuthentication.RedirectFromLoginPage(txtUname.Text, false); } else { lblErrorMsg.Text = "Invalid Login!"; lblErrorMsg.ForeColor = System.Drawing.Color.Red; txtUname.Focus(); } } }
您可以看到我们正在从数据库验证凭据,但现在它得到了 Forms 身份验证的支持。请看 FormsAuthentication.RedirectFromLoginPage(txtUname.Text, false); 这里 false 表示您不想为用户存储持久性 cookie。现在尝试使用以下 URL 直接访问 MyHome.aspx
"https:///MyAuthentication/SecurePages/MyHome.aspx"
您将被重定向到登录页面,URL 如下:https:///MyAuthentication/Login.aspx?ReturnUrl=%2fMyAuthentication%2fSecurePages%2fMyHome.aspx
成功登录后,您将被重定向到请求的页面,即 MyHome.aspx。
结论
因此,Forms 身份验证还有许多其他选项,例如 LogOut、Username 显示等。您可以下载代码以查看实际实现(请在您的系统上执行代码之前更新连接字符串)。本文旨在为初学者提供帮助。希望它有所帮助;我将在下一篇文章中更详细地介绍。也希望这对初学者有所帮助。
在此之前,尽情享受……一切顺利