`
wsql
  • 浏览: 11777149 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

阅读更多

以前用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;
}
}
}

分享到:
评论

相关推荐

    ASP.NET(C#) Web Api通过文件流下载文件的实例

    主要介绍了ASP.NET(C#) Web Api通过文件流下载文件的方法,提供源码下载,需要的朋友可以参考下。

    asp.net组件工具包vb.net web解决方案

    ASP.NET为广大.NET开发人员提供了一种优秀的体系结构,使他们可以通过... 本书适合那些能够在Visual Basic.NET中熟练开发ASP.NET应用程序,同时也熟知.NET基类库和ASP.NET站点配置的.NET开发人员及其他相关开发人员。

    ASP .Net 创建WEB站点(E文)

    介绍使用ASP .Net 创建WEB站点,只可惜是英文以的,对于初学者有帮助。

    ASP.NET v2.0入门经典中英文 源码(DOC) ASP.NET.rar

    软件介绍 ASP.NET具有开发效率高、平台无关性、安全性强等方面的优势,广泛用于创建动态Web站点和基于Web的分布式应用程序,是广大Windows程序员开发Web应用程序的有效工具。ASP.NET 2.0在Web应用程序开发方面迈出了...

    分享解决vs2015调试asp.net程序出现无法连接到已配置的开发 Web 服务器问题

    不靠谱方法2)什么按照windwos日志缺失asp.net core.Dll文件,到什么网址下载此类安装文件等等, 不靠谱方法3)什么在注册表增加什么键值,具体不说了 靠谱方法如下: 分析,因为前提是你的vs2015能用,并且新建asp...

    asp.net 利用webservice,dataset创建火车票查询系统

    asp.net 利用webservice,dataset创建火车票查询系统 asp.net 利用webservice,dataset创建火车票查询系统

    asp.net--开发站点前的配置

    Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web应用程序的配置信息(如最常用的设置ASP.NET Web应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后,...

    ASP.NET Web站点高级编程

    ASP.NET Web站点高级编程,包中包含一整本书:《Web站点高级编程》的所有资料,主要是pdg文件,请下载相关的阅读器下载,在百度里一搜pdg阅读器就有很多可下载

    asp.net微软认证全新考试题库.doc

    你创建了一个ASP.net应用程序,该程序将运行在TK公司的WEB站点上。你的应用程序包括100个WEB页面。你想配置你的应用程序,当HTTP代码发生错误时,可显示自定义的错误信息给用户。同时你想当程序发生错误时记录到日志...

    ASP.NET 2.0动态网站开发基础教程(C#) 第09章 ASP.NET Web服务 传送数据(共9页).ppt

    ASP.NET 2.0动态网站开发基础教程(C#) 第10章 配置ASP.NET应用程序 Global.asax Web config 缓存技术(共12页).ppt ASP.NET 2.0动态网站开发基础教程(C#) 第11章 提高ASP.NET应用程序的安全性 身份验证和授权 ...

    用ASP.NET管理IIS站点,源码提供

    可以通过ASP.NET页面添加删除修改IIS站点,就像在IIS管理器当中单击属性一样。主要用于虚拟主机提供商的客户通过WEB管理自己的网站。 主要技术是用了ASP.NET的身份模拟技术,App_Code/imp.cs构造函数中的用户名和...

    ASP.NET 2.0开发技术大全

    包括认识ASP.NET 2.0、ASP.NET 2.0网页语法、字符串与日期处理、Page对象、...在ASP.NET中的应用、高性能数据处理技术、ADO.NET数据库技术、数据绑定控件、ASP.NET数据缓存技术、站点导航和导航控件、Web用户控件、创建...

    ASP.NET 2.0入门经典(第4版)

    《ASP.NET 2.0 入门经典》将逐步引导您使用 ASP.NET 2.0 创建动态的、数据驱动的、复杂的Web站点。在本章结束时,我们将解释一些基本的想法并介绍一个完整的示例站点。然后将学习怎样使用 Visual Web Developer ...

    ASP.NET 4.5入门经典:涵盖C#和VB.NET(第7版) 源码

    通过实际动手练习,您将学到关于构建Web站点的第一手信息,同时能够深刻理解在浏览器中查看ASP.NET 4页面时,后台到底发生了什么。 这是第七版,也就是本源码书的介绍 The ultimate programming guide to ASP.NET ...

    Programming ASP.NET 中文版第三版(ASP.NET入门权威书籍PDF+源码) part1

    上传人提醒:本书适合了解c#语法的人阅读,看这本书前建议先看C#入门经典 ...本书对于ASP.NET 2.0技术和Visual Studio 2005进行了全面讲解,出色地囊括了读者在实际编程中会用到的ASP.NET的重要特性,十分适合中级读者。

    ASP.NET基础教程

    本书结合实例,全面系统地介绍了ASP.NET 2.0应用开发技术,...成员、角色管理和登录控件,用户配置和个性化,Web部件,状态管理,在ASP.NET 2.0中使用XML,提高网站性能的方法,跟踪和调试ASP.NET 2.0应用程序等内容。

    ASP.NET 4.5.1入门经典(in C# and VB) pdf原版[18MB]

    ASP.NET4.5.1入门经典(第8版)是一本综合性ASP.NET4.5.1入门指南,将为ASP.NET新手奠定坚实基础,并...第16章 ASP.NET 4.5 Web站点中的安全性 第17章 个性化Web站点 第18章 异常处理、调试和跟踪 第19章 部署Web站点

    asp.net web站点高级编程

    asp.net web站点高级编程,asp.net web站点高级编程的开发与学习

    ASP.NET和AJAX简洁教程

    介绍 尽管AJAX是种客户端技术,但实际上的开发...作为开始,使用Visual Studio 2005创建一个新的Web站点,注意把ASP.NET AJAX项目模板添加到新站点对话框,这个对话框包括一个"ASP.NET AJAX Enabled Web Site" 模板。

    Programming ASP.NET 中文版第三版(ASP.NET入门权威书籍PDF+源码) part3

    上传人提醒:本书适合了解c#语法的人阅读,看这本书前建议先看C#入门经典 ...本书对于ASP.NET 2.0技术和Visual Studio 2005进行了全面讲解,出色地囊括了读者在实际编程中会用到的ASP.NET的重要特性,十分适合中级读者。

Global site tag (gtag.js) - Google Analytics