一:什么是https
SSL(Security Socket Layer)全稱是加密套接字協議層,它位于HTTP協議層和TCP協議層之間,用于建立用戶與服務器之間的加密通信,確保所傳遞信息的安全性,同時SSL安全機制是依靠數字證書來實現的。
SSL基于公用密鑰和私人密鑰,用戶使用公用密鑰來加密數據,但解密數據必須使用相應的私人密鑰。使用SSL安全機制的通信過程如下:用戶與IIS服務器建立連接后,服務器會把數字證書與公用密鑰發送給用戶,用戶端生成會話密鑰,并用公共密鑰對會話密鑰進行加密,然后傳遞給服務器,服務器端用私人密鑰進行解密,這樣,用戶端和服務器端就建立了一條安全通道,只有SSL允許的用戶才能與IIS服務器進行通信。
提示:SSL網站不同于一般的Web站點,它使用的是“HTTPS”協議,而不是普通的“HTTP”協議。因此它的URL(統一資源定位器)格式為“https://網站域名”。
二:https的本地測試環境搭建
1:win7/windows server 2008R2中 IIS7/IIS7.5 搭配https本地測試環境
2:windows server 2003中IIS6.0 搭配https本地測試環境
三:asp.net 結合 https的代碼實現
https是由IIS,瀏覽器來實現的傳輸層加密,不需要特意的編碼。。。平時怎么在asp.net里面編寫代碼,就怎么寫。
很可能要問,為什么我的站點使用了https之后,用firebug之類的軟件查看值提交的時候,還是會顯示明文呢?例如,博客園的登陸界面提交。
http://passport.cnblogs.com/login.aspx
為什么這里還是能看到明文的用戶名和密碼呢?
原因是因為:https(ssl)的加密是發生在應用層與傳輸層之間,所以,在傳輸層看到的數據才是經過加密的,而我們捕捉到的http post的,是應用層的,是還沒經過加密的數據。
支付寶也是https的,但是他的同時也增加了安全控件來保護密碼, 以前認為這個只是用來防鍵盤監聽的,其實,看下面http post截獲的密碼:這個安全控件把給request的密碼也先加了密,緊接著https再加次密,果然是和錢打交道的,安全級別高多了:)
四:http網站轉換成https網站之后遇到的問題
整站https還是個別的頁面采用https?網站的連接是使用相對路徑?還是絕對路徑?
如果是整站都是https,那么會顯得網頁有些慢,如果是個別頁面采用https,那么如何保證從https轉換到http的時候的url的準確性呢?
比如我們用http的時候,網站的頭部底部都是用的相對路徑,假如你的頁面是 http://aa/index.aspx 你跳轉到 https://aa/login.aspx 這里怎么來跳轉?只能把超鏈接寫死
<a href=”https://aa/login.aspx”>登陸</a> 但是這樣的話,你跳轉過去之后的頁面 ,所有的相對路徑都變成了https開頭了,這樣很影響網站的效率。
雖然使用絕對地址可以解決,但是那樣顯然不好移植。
下面就是使用第三方的組件,來解決上面的這個問題
http://www.codeproject.com/Articles/7206/Switching-Between-HTTP-and-HTTPS-Automatically-Ver
步驟 先下載dll文件 http://code.google.com/p/securityswitch/downloads/list 我選擇的是 SecuritySwitch v4.2.0.0 - Binary.zip這個版本
1: 我們來看看測試項目
admin 文件夾,需要登錄之后,才能訪問。admin里面的 login.aspx 可以訪問。整個admin文件夾都需要https訪問
contact.aspx 需要https 訪問
default.aspx 和 view.aspx 采用 http 訪問
鏈接我們都采用相對路徑,并沒有寫死成 http://www.xx.com/a.aspx 或者是 https://www.xx.com/a.aspx
下面我們開始用SecuritySwith來實現上面的https和http訪問的規則
2:在項目上,添加引用 SecuritySwitch.dll ,并且添加 智能提示
這樣,只能提示就有了。
3:然后我們在web.config里面添加設置 。根據IIS的不同,還分為 IIS6+ IIS7.X(經典模式) 以及 IIS7(集成模式) 的不同的配置,這里我們是按照IIS6+IIS7.X的(經典模式)來配置的.
只看看里面的 SSL配置即可
<?xml version="1.0"?>
<configuration>
<!--SSL配置1開始-->
<configSections>
<section name="securitySwitch" type="SecuritySwitch.Configuration.Settings, SecuritySwitch" />
</configSections>
<securitySwitch baseInsecureUri="http://webjoeyssl" baseSecureUri="https://webjoeyssl" xmlns="http://SecuritySwitch-v4.xsd" mode="On">
<!--如果你的http和https僅僅只有一個s的區別,那么這里的base的2個url可以不寫,那為什么還要搞這2個url呢?因為比如
你的 baseInsecureUri (基本不安全網址) 是 http://www.qq.com
而你的 baseSecureUri (基本安全網址) 是 https://safe.qq.com
然后這個時候你訪問一個需要https的頁面,假如是 login.aspx?return=joey
假如你是通過http://www.qq.com/login.aspx?return=joey訪問的,那么這個
頁面會跳轉到http://safe.qq.com/login.aspx?return=joey
-->
<paths>
<add path="~/contact.aspx"/>
<add path="~/admin/login.aspx"/>
<add path="~/admin" />
<!--這里的admin因為不僅是 admin 文件夾,而且還包含類似的 adminNews.aspx adminQQ.aspx 頁面"-->
<!--但是如果是 ~/admin/ 就是專門指admin文件夾-->
</paths>
</securitySwitch>
<!--SSL配置1結束—>
<appSettings />
<system.web>
<compilation debug="true">
</compilation>
<!-- 內置票據認證 start-->
<authentication mode="Forms">
<forms name="mycook" loginUrl="admin/login.aspx" protection="All" path="/" />
</authentication>
<!--SSL配置2 如果是 IIS <=6.x, IIS 7.x + 經典模式-->
<httpModules>
<add name="SecuritySwitch" type="SecuritySwitch.SecuritySwitchModule, SecuritySwitch" />
</httpModules>
<!--SSL配置2結束-->
</system.web>
<!--SSL配置2 如果是IIS7.X + 集成模式-->
<!--<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
--><!-- for IIS 7.x + 集成模式 --><!--
<add name="SecuritySwitch" type="SecuritySwitch.SecuritySwitchModule, SecuritySwitch" />
</modules>
</system.webServer>-->
<!--如果是IIS7.X+集成模式 SSL配置2 結束—>
</configuration>
4:其他就沒有你什么事情了,url的 http 后臺 https 的切換,都是securitySwitch 來控制
五:asp.net 內置票據認證+securitySwitch 的實現(就是上面說的 admin 需要登錄才能訪問)看下文
http://www.cnblogs.com/naniannayue/archive/2012/11/23/2784568.html
六:securitySwitch 4.2 中文幫助文檔
http://www.cnblogs.com/naniannayue/archive/2012/11/23/2784653.html
互聯網行業更加發達的今天,為避免網站被惡意自動注冊,登錄,注水,留言等一系列危及網站安全的行為,驗證碼的作用就更加的重要。下面我們介紹一下在.NET網站中如何制作一個圖片類型的驗證碼以及如何使用驗證碼進行檢查。
1.驗證碼圖片生成
1.1生成4位長度的隨機碼
1.2創建隨機碼圖片
1.3調用兩個方法生成圖片實例
2.在html頁面引用
當完成上訴操作之后即可在前端的頁面上看到一個自動生成的驗證碼圖片;并且驗證碼進行點擊時是會隨著點擊動作進行變動;且由于將調用的方式放置在了頁面當中,故此每一次打開頁面都會有一個刷新動作,保證了每次打開頁面都會有一個不同的驗證碼形成。
3.驗證碼填寫是否正確的驗證
驗證的動作是在后臺進行驗證的,故此需要喚起一個表單的提交。需要用戶將需要填寫的信息進行填充,并將看到的驗證碼填寫入對應的驗證碼文本框;當表單的提交動作觸發時就需要我們在后臺進行對于驗證碼是否正確來進行初步的驗證;驗證碼填寫正確則將表單提交的內容填充到數據集當中,否則將返回一個驗證碼填寫錯誤的返回值,阻止下一步的提交動作。
當驗證碼判斷錯誤以后,進行提示并再次更改驗證碼
以上就是一個完整的驗證碼生成以及驗證碼驗證的完整案例,希望對大家有所幫助;或者有更好的方法也請不吝賜教。
asp.net開發的對.aspx,.ascx和.ashx都不會陌生。關于它們,網上有很多文章介紹。“紙上得來終覺淺,絕知此事要躬行”,下面自己總結一下做個筆記。
1、.aspx
Web窗體設計頁面。Web窗體頁由兩部分組成:視覺元素(html、服務器控件和靜態文本)和該頁的編程邏輯(VS中的設計視圖和代碼視圖可分別看到它們對應得文件)。VS將這兩個組成部分分別存儲在一個單獨的文件中。視覺元素在.aspx 文件中創建。
2、.ascx
asp.net的用戶控件,是作為一種封裝了特定功能和行為(這兩者要被用在Web應用程序的各種頁面上)的Web頁面被開發的。一個用戶控件包含了html、代碼和其他Web或者用戶控件的組合,并在Web服務器上以自己的文件格式保存,其擴展名是*.ascx。asp.net里的缺省配置并不允許Web客戶端通過url來訪問這些文件,但是這個網站的其他頁面可以集成這些文件里所包含的功能。
3、.ashx
前面兩個都太熟悉了,這個才是要講的重點。
(1)、使用舉例
.ashx文件是主要用來寫web handler的。使用.ashx 可以讓你專注于編程而不用管相關的web技術。我們熟知的.aspx是要做html控件樹解析的,.aspx包含的所有html實際上是一個類,所有的html都是類里面的成員,這個過程在.ashx是不需要的。ashx必須包含IsReusable屬性(這個屬性代表是否可復用,通常為true),而如果要在ashx文件用使用Session必須實現IRequiresSessionState接口.
一個簡單的實現修改登錄用戶密碼的示例:
using System;
using System.Collections.Generic;
using System.Linq;
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.Web.SessionState;
namespace Test
{
public class HandlerTest : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ClearContent();
context.Response.ContentType="text/plain";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //無緩存
string action=context.Request.Params["action"]; //外部請求
if (action=="modifyPwd") //用戶改密碼
{
string oldPwd=context.Request.Params["pwd"];
//在ashx文件用使用Session必須實現IRequiresSessionState接口
//Session["LogedUser"]是登錄用戶的會話,用戶名和密碼都是test
if (oldPwd.ToUpper() !=((context.Session["LogedUser"]) as Customer).Password.ToUpper()) //用戶輸入的舊密碼和當前登錄用戶的不相同
{
context.Response.Write("舊密碼輸入錯誤!");
}
else
{
context.Response.Write("舊密碼輸入正確!");
}
}
context.Response.End();
}
public bool IsReusable
{
get
{
return true;
}
}
}
}
客戶端的調用(js和頁面部分):
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ASHXTest.aspx.cs" Inherits="ASHXTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>mytest</title>
<script type="text/javascript">
function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
function createXMLHTTP() {
var xmlHttp=false;
var arrSignatures=["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"];
for (var i=0; i < arrSignatures.length; i++) {
try {
xmlHttp=new ActiveXObject(arrSignatures[i]);
return xmlHttp;
}
catch (oError) {
xmlHttp=false; //ignore
}
}
// throw new Error("MSXML is not installed on your system.");
if (!xmlHttp && typeof XMLHttpRequest !='undefined') {
xmlHttp=new XMLHttpRequest();
}
return xmlHttp;
}
var xmlReq=createXMLHTTP();
// 發送ajax處理請求(這里簡單驗證舊密碼的有效性)
function validateOldPwd(oTxt) {
var url="/HandlerTest.ashx?action=modifyPwd&pwd=" + escape(oTxt.value); //.ashx文件
xmlReq.open("get", url, true);
xmlReq.setRequestHeader("If-Modified-Since", "0");
xmlReq.onreadystatechange=callBack;
xmlReq.send(url); // 發送文本
}
function callBack() {
if (xmlReq.readyState==4) {
if (xmlReq.status==200) {
alert(xmlReq.responseText); // 接收文本
}
else if (xmlReq.status==404) {
alert("Requested URL is not found.");
} else if (xmlReq.status==403) {
alert("Access denied.");
} else
alert("status is " + xmlReq.status);
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="txtOldPwd" type="text" onblur="validateOldPwd(this)" />
</div>
</form>
</body>
</html>
分析:
a、以前我們通常都是通過一個簡單的aspx文件實現的功能,其實通過ashx也可以。
筆者曾經寫過的一篇ajax:數據傳輸方式簡介 ,通過對比,我們發現aspx要將前后臺顯示和處理邏輯分開,所以就弄成了兩個文件,其實,在最終編譯的時候,aspx和cs還是會編譯到同一個類中去.這中間就要設計html的一些邏輯處理;而ashx不同,它只是簡單的對web http請求的直接返回你想要返回的結果.比aspx少處理了html的過程(但是ashx也可以處理html的一些邏輯,只是通常都不這么用)。理論上ashx比aspx要快。
b、還是在相同的舊文里,我們知道數據傳輸的幾種方式,其實ashx都可以實現(修改ashx文件里context.Response.ContentType 即可),這里不再贅述了。
(2)、ashx特別適合于生成動態圖片,生成動態文本(純文本,json,xml,javascript等即可)等。
(3)、.ashx文件有個缺點:它處理控件的回發事件非常麻煩。處理數據的回發,通常都需要一些.aspx頁的功能,只有自己手動處理這些功能(還不如直接建一個aspx文件來處理)。所以,一般使用.ashx輸出一些不需要回發處理的項目即可。
4、總結
aspx-->P(Page)
ascx-->C(Control)
ashx-->H(HttpHandler)
當瀏覽器訪問web服務器,我們最終接收到的還是html文本。瀏覽器通過渲染引擎解釋這些標簽,在屏幕上展現出可見的效果。而asp.net不過就是我們應用的一種平臺技術來"變相"解釋html的,說白了它就是為了提高生產率,它的技術術語再多,本質上還是html范疇內的東西(如果你不通過那些動態頁面技術完全利用html和瀏覽器(當然包括js)技術來實現動態頁面效果,那么你會發現效果有了代碼量也相當可觀).所以說web開發的底層就是一堆的html標簽,無論是asp.net還是jsp都是對html某種方式的包裝,是html的產物。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。