分享
 
 
 

在ASP.NET中创建安全的web站点(配置)

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

以前用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" 以禁用自定义错误信息。

为每个要处理的错误添加 <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.login" %>

<!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 password, // 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;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有