65.9K
CodeProject 正在变化。 阅读更多。
Home

表单身份验证!入门

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.87/5 (13投票s)

2007年8月17日

CPOL

4分钟阅读

viewsIcon

42048

downloadIcon

340

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 显示等。您可以下载代码以查看实际实现(请在您的系统上执行代码之前更新连接字符串)。本文旨在为初学者提供帮助。希望它有所帮助;我将在下一篇文章中更详细地介绍。也希望这对初学者有所帮助。

在此之前,尽情享受……一切顺利

© . All rights reserved.