程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在ASP.NET中創建安全的web站點(配置)

在ASP.NET中創建安全的web站點(配置)

日期:2017/1/13 10:46:41      編輯:.NET實例教程

以前用ASP,PHP,JSP編寫網站代碼的時候,站點安全性總是一件頭疼的事情,雖然我們編寫了用戶登錄,注冊,驗證頁面,但是效果總是不理想。有時候我們不得不用大量的session變量來存放相關信息,處處設防。而在.Net環境下,這個問題處理起來就非常容易了。關鍵是要充分理解web.config文件。首先,介紹一下web.config文件。

<?XML version="1.0" encoding="utf-8" ?>
<configuration>

<system.web>

<!-- 動態調試編譯
設置 compilation debug="true" 以將調試符號(.pdb 信息)
插入到編譯頁中。因為這將創建執行起來
較慢的大文件,所以應該只在調試時將該值設置為 true,而所有其他時候都設置為
false。有關更多信息,請參考有關
調試 ASP.Net 文件的文檔。
-->
<compilation defaultLanguage="vb" debug="true" />

<!-- 自定義錯誤信息
設置 customErrors mode="On" 或 "RemoteOnly" 以啟用自定義錯誤信息,或設置為 "Off" 以禁用自定義錯誤信息。
in" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD Html 4.0 Transitional//EN" >
<Html>
<HEAD>
<title>Secure Site</title>
<meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClIEntScript">
<meta content="http://schemas.microsoft.com/intellisense/IE5"
name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="login" method="post" runat="server">
<table cellSpacing="0" cellPadding="0" border="0">
<tr>
<td vAlign="top" align="left">
<ASP:label id="Message" Runat="server" ForeColor="#ff0000">
</ASP:label>
</td>
</tr>
<tr>
<td vAlign="top" align="left">
<b>E-mail:</b>
</td>
</tr>
<tr>
<td vAlign="top" align="left">
<ASP:textbox id="username" Runat="server" Width="120">
</ASP:textbox>
</td>
</tr>
<tr>
<td vAlign="top" align="left">
<b>PassWord:</b>
</td>
</tr>
<tr>
<td vAlign="top" align="left">
<ASP:textbox id="passWord" Runat="server"
Width="120" TextMode="PassWord">
</ASP:textbox>
</td>
</tr>
<tr>
<td vAlign="top" align="left">
<ASP:checkbox id="saveLogin" Runat="server"
Text="<b>Save my login</b>">
</ASP:checkbox>
</td>
</tr>
<tr>
<td vAlign="top" align="right">
<ASP:imagebutton id="btnLogin" Runat="server"
ImageUrl="/images/w2k/login/btnLogin.gif">
</ASP:imagebutton>
</td>
</tr>
</table>
</form>
</body>
</Html>


界面做好之後,就開始編寫提交按鈕事件,首先需要注冊該事件,代碼如下:

private void InitializeComponent()

this.btnLogin.Click += new System.Web.UI.ImageClickEventHandler(this.btnLogin_Click);
.
.
.
}
事件注冊好之後,自然就是編寫事件處理函數了:

private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
CCommonDB sql = new CCommonDB();
string redirect = "";

if((redirect = sql.AuthenticateUser(this.Session, this.Response,
username.Text, passWord.Text, saveLogin.Checked)) != string.Empty)
{
// Redirect the user
Response.Redirect(redirect);
}
else
{
Message.Text = "Login Failed!";
}
}
讀者看完上面的代碼之後一定想問CCommonDB是哪裡來的東東,這是我編寫的一個類,用來處理用戶登錄信息的,如果成功則把相關信息寫入session、CookIE和SQL數據庫,同時跳到default.ASPx頁面。具體如下:

CCommonDB.cs

namespace secure.Components
{
public class CCommonDB : CSql
{
public CCommonDB() : base() { }

public string AuthenticateUser(
System.Web.SessionState.HttpSessionState obJSession, // Session Variable
System.Web.HttpResponse objResponse, // Response Variable
string email, // Login
string pas
sword, // PassWord
bool bPersist // Persist login
)
{
int nLoginID = 0;
int nLoginType = 0;

// Log the user in
Login(email, passWord, ref nLoginID, ref nLoginType);

if(nLoginID != 0) // Success
{
// Log the user in
System.Web.Security.FormsAuthentication.SetAuthCookIE(nLoginID.ToString(), bPersist);

// Set the session varaibles 
obJSession["loginID"] = nLoginID.ToString();
obJSession["loginType"] = nLoginType.ToString();

// Set cookIE information incase they made it persistant
System.Web.HttpCookie wrapperCookie = new System.Web.HttpCookIE("wrapper");
wrapperCookIE.Value = obJSession["wrapper"].ToString();
wrapperCookIE.Expires = DateTime.Now.AddDays(30);

System.Web.HttpCookie lgnTypeCookie = new System.Web.HttpCookIE("loginType");
lgnTypeCookIE.Value = obJSession["loginType"].ToString();
lgnTypeCookIE.Expires = DateTime.Now.AddDays(30);

// Add the cookIE to the response
objResponse.Cookies.Add(wrapperCookIE);
objResponse.Cookies.Add(lgnTypeCookIE);

return "/candidate/default.ASPx";
}
case 1: // Admin Login
{
return "/admin/default.ASPx";
}
case 2: // Reporting Login
{
return "/reports/default.ASPx";
}
default:
{
return string.Empty;
}
}
}
else
{
return string.Empty;
}
}

/// <summary>
/// VerifIEs the login and passWord that were given
/// </summary>
/// <param name="email">the login</param>
/// <param name="password">the passWord</param>
/// <param name="nLoginID">returns the login id</param>
/// <param name="nLoginType">returns the login type</param>
public void Login(string email, string passWord, ref int nLoginID, ref int nLoginType)
{
ResetSql();

DataSet ds = new DataSet();

// Set our parameters
SqlParameter paramLogin = new SqlParameter("@username", SqlDbType.VarChar, 100);
paramLogin.Value = email;

SqlParameter paramPassword = new SqlParameter("@passWord", SqlDbType.VarChar, 20);
paramPassword.Value = passWord;


Command.CommandType = CommandType.StoredProcedure;
Command.CommandText = "glbl_Login";
Command.Parameters.Add(paramLogin);
Command.Parameters.Add(paramPassWord);

Adapter.TableMappings.Add("Table", "Login");
Adapter.SelectCommand = Command;
Adapter.Fill(ds);

if(ds.Tables.Count != 0)
{
DataRow row = ds.Tables[0].Rows[0];

// Get the login id and the login type
nLoginID = Convert.ToInt32(row["Login_ID"].ToString());
nLoginType = Convert.ToInt32(row["Login_Type"].ToString());
}
else
{
nLoginID = 0;
nLoginType = 0;
}
}
}

abstract public class CSql
{
private SqlConnection sqlConnection; // Connection string
private SqlCommand sqlCommand; // Command
private SqlDataAdapter sqlDataAdapter; // Data Adapter 
private DataSet sqlDataSet; // Data
Set

public CSql()
{
sqlConnection = new SqlConnection(ConfigurationSettings.APPSettings["ConnectionString"]);
sqlCommand = new SqlCommand();
sqlDataAdapter = new SqlDataAdapter();
sqlDataSet = new DataSet();

sqlCommand.Connection = sqlConnection;
}

/// <summary>
/// Access to our sql command
/// </summary>
protected SqlCommand Command
{
get { return sqlCommand; }
}

/// <summary>
/// Access to our data adapter
/// </summary>
protected SqlDataAdapter Adapter
{
get { return sqlDataAdapter; }
}

/// <summary>
/// Makes sure that everything is clear and ready for a new query
/// </summary>
protected void ResetSql()
{
if(sqlCommand != null)
{
sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
}
if(sqlDataAdapter != null)
sqlDataAdapter = new SqlDataAdapter();

if(sqlDataSet != null)
sqlDataSet = new DataSet();
}

/// <summary>
/// Runs our command and returns the dataset
/// </summary>
/// <returns>the data set</returns>
protected DataSet RunQuery()
{
sqlDataAdapter.SelectCommand = Command;

sqlConnection.Open();
sqlConnection.Close();

sqlDataAdapter.Fill(sqlDataSet);

return sqlDataSet;
}
}
}

http://blog.csdn.Net/tIElu0144/archive/2007/02/05/1502894.ASPx


為每個要處理的錯誤添加 <error> 標記。
-->
<customErrors mode="RemoteOnly" />

<!-- 身份驗證 
此節設置應用程序的身份驗證策略。可能的模式是 \“Windows\”、
\“Forms\”、\“Passport\”和 \“None\”
-->
<authentication mode="Windows" />


<!-- 授權 
此節設置應用程序的授權策略。可以允許或拒絕用戶或角色訪問
應用程序資源。通配符:"*" 表示任何人,"?" 表示匿名 
(未授權的)用戶。
-->
<authorization>
<allow users="*" /> <!-- 允許所有用戶 -->

<!-- <allow users="[逗號分隔的用戶列表]"
roles="[逗號分隔的角色列表]"/>
<deny users="[逗號分隔的用戶列表]"
roles="[逗號分隔的角色列表]"/>
-->
</authorization>

<!-- 應用程序級別跟蹤記錄
應用程序級別跟蹤在應用程序內為每一頁啟用跟蹤日志輸出。
設置 trace enabled="true" 以啟用應用程序跟蹤記錄。如果 pageOutput="true",則
跟蹤信息將顯示在每一頁的底部。否則,可以通過從 Web 應用程序
根浏覽 "trace.axd" 頁來查看 
應用程序跟蹤日志。
-->
<trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />


<!-- 會話狀態設置
默認情況下,ASP.Net 使用 cookIE 標識哪些請求屬於特定的會話。
如果 cookIE 不可用,則可以通過將會話標識符添加到 URL 來跟蹤會話。
若要禁用 cookie,請設置 sessionState cookIEless="true"。
-->
<sessionState 
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;passWord="
cookIEless="false" 
timeout="20" 
/>

<!-- 全球化
此節設置應用程序的全球化設置。
-->
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

</system.web>

</configuration>

好了,相信看過上面的介紹以後,對web.config文件一定非常了解了吧。下面我們就切入主題。為了防止用戶沒有經過驗證就訪問站點,我們的處理方法是當用戶沒有通過驗證的時候點擊任何頁面將會直接跳到Login.ASPx頁面,具體代碼如下:

<authentication mode="Forms">
<forms name="yourAuthCookIE" loginUrl="login.ASPx"
protection="All" path="/" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
但是這樣會產生一個問題,那就是如果我的站點有一些信息是可以讓任意用戶隨意訪問的,比如站點簡介,使用說明等。如果按照上面的處理方法豈不讓用戶覺得很麻煩,呵呵,不急,在ASP.Net中自然有相應的解決辦法。下面的代碼可以實現匿名用戶訪問Test.ASPx頁面:

<location path="test.ASPx">
<system.web>
<authorization>
<allow users="?" />
</authorization>
</system.web>
</location>

解決了上面兩個問題,相信大家心裡一定有底了吧。下面就開始實現login.ASPx頁面。利用C#和SQL Server2000,創建一個webform頁面,加入相應的控件。具體代碼如下:

<%@ Page language="c#" Codebehind="login.ASPx.cs"
AutoEventWireup="false" Inherits="secure.log

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved