兩種方法的共同部分
在根目錄下新建Default.aspx,Login.aspx,登陸模板使用的是網上隨意找的,當然也可以不用的其實。
前台代碼
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login_.aspx.cs" Inherits="完美登陸.Login" %>
<!DOCTYPE html>
<html>
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>后台登錄</title>
<link href="Scripts/css/login.css" rel="stylesheet" />
<script src="Scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
//這里有兩個用處:第一、點擊驗證碼刷新一次,
//第二、在一般處理程序后面加些冗余的數據避免瀏覽器直接從緩存中拿到原來的驗證碼
$(function () {
$("#Image").click(function () {
var oldSrc = $(this).attr("src");
oldSrc += new Date().toString("yyyy-MM-dd HH:mm:ss");
$(this).attr("src", oldSrc);
})
});
</script>
</head>
<body>
<div class="login">
<div class="message">登錄</div>
<div id="darkbannerwrap"></div>
<form id="form1" runat="server">
<input name="action" value="login" type="hidden">
<input name="username" placeholder="用戶名" required="" type="text">
<hr class="hr15">
<input name="password" placeholder="密碼" required="" type="password">
<hr class="hr15">
<input name="VCode" placeholder="驗證碼" required="" type="text" style="width:50%;height:40px"> <img id="Image" src="Public/Common/ValideCode.ashx?id=1"/>
<hr class="hr15">
<input value="登錄" style="width: 100%;" type="submit">
<hr class="hr20">
</form>
</div>
</body>
</html>
后置代碼類
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
string Name = Request["username"];
string password = Request["password"];
string VCode = Request["VCode"];
//在驗證碼處理程序中,將驗證碼放入Session中(一般處理程序虛要實現標記接口IRequiresSessionState)
if (VCode == Session["ValidateCode"].ToString())
{
if (Name == "xuxuzhaozhao1" && password == "XXXX")
{
//X分別填寫下面兩種方法不同的代碼
X
}
}
else
{
Response.Write("<script>alert('驗證碼錯誤')</script>");
}
}
}
第一種方法:
這種方法比較簡單,是我從某個教學視頻上看來得,感覺還闊以。
其核心思想是,在登錄校驗成功后,將該用戶放入Session["User"]
中,然后在每個需要登錄后才能訪問的頁面中判斷Session["User"]
是否為空,如果為空在跳轉到登陸頁面,當然好的程序員是不會讓相同的代碼多次出現的。
基於所有的webform
都繼承自System.Web.UI.Page
,所以我們要做的就是新建一個BasePage
,讓BasePage
來繼承System.Web.UI.Page
,然后其他的webform
來繼承BasePage
。
1、BasePage.cs
//所有頁面初始化的時候都要執行BasePage的Page_Init方法
//Page_Load執行之前會先去執行Page_Init方法
protected virtual void Page_Init(object sender, EventArgs e)
{
if (Session["User"] == null)
{
Response.Redirect("~/Login.aspx");
return;
}
}
2、在登錄頁面的X處填寫以下代碼
Session["User"] = UserModel;
Response.Redirect("~/Default.aspx")
這個方法呢,我暫時還不知道怎樣驗證后返回請求頁面,只能寫死到默認頁面,希望哪個有緣人知道的不吝賜教。
第二種方法:
哎,這種方法就很舒服了。跟上篇那個MVC身份驗證相同
1、配置根目錄下的Web.config加入節點
<system.web>
<authentication mode="Forms">
<forms loginUrl="Login_.aspx"></forms>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
2、在項目中放入新建一個Public文件夾,這里存放不需要身份驗證就能訪問的頁面或處理程序如:注冊頁面,驗證碼生成處理程序。在Public文件夾下加入Web.config文件,不要問我為什么有兩個Web.config,反正縣官不如現管,Web.config加入以下xml代碼
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</configuration>
3、在X處填寫以下代碼
//將經過身份驗證的用戶重定向回最初請求的 URL或者Default.aspx。
FormsAuthentication.RedirectFromLoginPage(xxxName, true);
一旦登錄成功后,可以在其他任意頁面獲取登錄者的姓名xxxName
<%if(User.Identity.IsAuthenticated){%>
<b><%= User.Identity.Name%></b>
<%}%>
此處是福利!!!!
驗證碼生成類(可以直接拷貝使用)
ValidateCode.cs
//=================================================
// *
// 作 者:xuxuzhaozhao
// 郵 箱:xuxuzhaozhao@icloud.com
// 博 客:http://www.cnblogs.com/xuxuzhaozhao/
// 時 間:2017年3月18日 15:48:51
// 描 述:驗證碼生成類,配合一個驗證碼一般處理程序一起使用
// *
//=================================================
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
namespace 完美登陸.Public.Common
{
/// <summary>
///生成驗證碼
/// </summary>
public class ValidateCode
{
public ValidateCode()
{
}
/// <summary>
/// 驗證碼的最大長度
/// </summary>
public int MaxLength
{
get { return 10; }
}
/// <summary>
/// 驗證碼的最小長度
/// </summary>
public int MinLength
{
get { return 1; }
}
/// <summary>
/// 生成驗證碼
/// </summary>
/// <param name="length">指定驗證碼的長度</param>
/// <returns></returns>
public static string CreateValidateCode(int length)
{
int[] randMembers = new int[length];
int[] validateNums = new int[length];
string validateNumberStr = "";
//生成起始序列值
int seekSeek = unchecked((int)DateTime.Now.Ticks);
Random seekRand = new Random(seekSeek);
int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
int[] seeks = new int[length];
for (int i = 0; i < length; i++)
{
beginSeek += 10000;
seeks[i] = beginSeek;
}
//生成隨機數字
for (int i = 0; i < length; i++)
{
Random rand = new Random(seeks[i]);
int pownum = 1 * (int)Math.Pow(10, length);
randMembers[i] = rand.Next(pownum, Int32.MaxValue);
}
//抽取隨機數字
for (int i = 0; i < length; i++)
{
string numStr = randMembers[i].ToString();
int numLength = numStr.Length;
Random rand = new Random();
int numPosition = rand.Next(0, numLength - 1);
validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
}
//生成驗證碼
for (int i = 0; i < length; i++)
{
validateNumberStr += validateNums[i].ToString();
}
return validateNumberStr;
}
/// <summary>
/// 創建驗證碼的圖片,把驗證碼寫到響應流中去
/// </summary>
/// <param name="containsPage">要輸出到的page對象</param>
/// <param name="validateNum">驗證碼</param>
public static void CreateValidateGraphic(string validateCode,HttpContext context)
{
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成隨機生成器
Random random = new Random();
//清空圖片背景色
g.Clear(Color.White);
//畫圖片的干擾線
for (int i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new Font("monaco", 12, (FontStyle.Bold | FontStyle.Italic));
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateCode, font, brush, 3, 2);
//畫圖片的前景干擾點
for (int i = 0; i < 100; i++)
{
int x = random.Next(image.Width);
int y = random.Next(image.Height);
image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//畫圖片的邊框線
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
//保存圖片數據
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
//輸出圖片流
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(stream.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
/// <summary>
/// 得到驗證碼圖片的長度
/// </summary>
/// <param name="validateNumLength">驗證碼的長度</param>
/// <returns></returns>
public static int GetImageWidth(int validateNumLength)
{
return (int)(validateNumLength * 12.0);
}
/// <summary>
/// 得到驗證碼的高度
/// </summary>
/// <returns></returns>
public static double GetImageHeight()
{
return 22.5;
}
}
}