前言:
昨天思路錯誤,白忙了一上午因為Exchange安裝好之後是依附于IIS的是以我們看到登陸界面也是個.aspx頁面 通過IIS找到的Exchange安裝目錄發現隻有logon.aspx頁面 沒有也不可能有logon.aspx.cs頁面,說白了就是微軟給咱們寫好了一個(一套)軟體--Exchange郵件服務系統,對于使用者,親你隻需要安裝就行了。。。
後語:
這意味着exchange走的也是IIS,也是asp.net那一套流程,ok 需求來了:
上帝:我想要在郵箱登陸的時候加一個驗證碼的功能,這樣不是會更安全嘛。
開發者:額,好吧。。。(心說,尼瑪坑爹呐,這是微軟寫好的我怎麼給你加驗證碼呀!!)
兒子就算是在坑爹,那也是咱兒子啊,滿足不了他到時候認賊作父就不好了。
說了半天廢話咱們奔主題吧。。。。。。。。
主題:
既然我們能看到Exchange安裝好部署後的頁面能對于前端來講我們還是可以改變的,思路有一下3種:
1)網上案例:
2)前端驗證
顧名思義,就是使用js來在前端動态生成驗證功能,控制使用者登入
缺點:這隻是表面的現象,一旦有高手察覺這個驗證功能隻是張紙那麼薄,很容易捅破。
demo:效果如下
<a target="_blank" href="http://blog.51cto.com/attachment/201309/133947902.png"></a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<code><</code><code>html</code> <code>xmlns</code><code>=</code><code>"http://www.w3.org/1999/xhtml"</code> <code>></code>
<code><</code><code>head</code><code>></code>
<code> </code><code><</code><code>title</code><code>>無标題頁</</code><code>title</code><code>></code>
<code> </code><code><</code><code>style</code> <code>type</code><code>=</code><code>"text/css"</code><code>></code>
<code> </code><code>.code</code>
<code> </code><code>{</code>
<code> </code><code>background-image:url(code.jpg);</code>
<code> </code><code>font-family:Arial;</code>
<code> </code><code>font-style:italic;</code>
<code> </code><code>color:Red;</code>
<code> </code><code>border:0;</code>
<code> </code><code>padding:2px 3px;</code>
<code> </code><code>letter-spacing:3px;</code>
<code> </code><code>font-weight:bolder;</code>
<code> </code><code>}</code>
<code> </code><code>.unchanged</code>
<code> </code><code></</code><code>style</code><code>></code>
<code> </code><code><</code><code>script</code> <code>language</code><code>=</code><code>"javascript"</code> <code>type</code><code>=</code><code>"text/javascript"</code><code>></code>
<code> </code><code>var code; //在全局 定義驗證碼</code>
<code> </code><code>function createCode() {</code>
<code> </code><code>code = "";</code>
<code> </code><code>var codeLength = 6;//驗證碼的長度</code>
<code> </code><code>var checkCode = document.getElementById("checkCode");</code>
<code> </code><code>var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');//所有候選組成驗證碼的字元,當然也可以用中文的</code>
<code> </code><code>for (var i = 0; i < </code><code>codeLength</code><code>; i++) {</code>
<code> </code><code>var </code><code>charIndex</code> <code>= </code><code>Math</code><code>.floor(Math.random() * 36);</code>
<code> </code><code>code += selectChar[charIndex];</code>
<code> </code><code>}</code>
<code> </code><code>// alert(code);</code>
<code> </code><code>if (checkCode) {</code>
<code> </code><code>checkCode.className</code> <code>= </code><code>"code"</code><code>;</code>
<code> </code><code>checkCode.value</code> <code>= </code><code>code</code><code>;</code>
<code> </code><code>function validate() {</code>
<code> </code><code>var </code><code>inputCode</code> <code>= </code><code>document</code><code>.getElementById("input1").value;</code>
<code> </code><code>if (inputCode.length <= 0) {</code>
<code> </code><code>alert("請輸入驗證碼!");</code>
<code> </code><code>else if (inputCode.toUpperCase() != code.toUpperCase()) {</code>
<code> </code><code>alert("驗證碼輸入錯誤!");</code>
<code> </code><code>createCode();//重新整理驗證碼</code>
<code> </code><code>else {</code>
<code> </code><code>alert("^-^ OK");</code>
<code> </code><code></script></code>
<code></</code><code>head</code><code>></code>
<code><</code><code>body</code> <code><form </code><code>action</code><code>=</code><code>"#"</code><code>></code>
<code> </code><code><</code><code>table</code><code>></code>
<code> </code><code><</code><code>tr</code><code>><</code><code>td</code><code>>姓 名:</</code><code>td</code><code>><</code><code>td</code><code>><</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>style</code><code>=</code><code>"width: 160px;"</code><code>/></</code><code>td</code><code>></</code><code>tr</code><code>></code>
<code> </code><code><</code><code>tr</code><code>><</code><code>td</code><code>>密 碼:</</code><code>td</code><code>><</code><code>td</code><code>><</code><code>input</code> <code>type</code><code>=</code><code>"password"</code> <code>style</code><code>=</code><code>"width: 160px;"</code><code>/></</code><code>td</code><code>></</code><code>tr</code><code>></code>
<code> </code><code><</code><code>tr</code><code>><</code><code>td</code><code>>驗證碼:</</code><code>td</code><code>><</code><code>td</code><code>><</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>style</code><code>=</code><code>"width: 160px;"</code> <code>id</code><code>=</code><code>"input1"</code> <code>/></code>
<code> </code><code><</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>readonly</code><code>=</code><code>"readonly"</code> <code>id</code><code>=</code><code>"checkCode"</code> <code>class</code><code>=</code><code>"unchanged"</code> <code>style</code><code>=</code><code>"width: 80px"</code> <code>/></</code><code>td</code><code>></</code><code>tr</code><code>></code>
<code> </code><code><</code><code>tr</code><code>><</code><code>td</code><code>></</code><code>td</code><code>><</code><code>td</code><code>><</code><code>input</code> <code>id</code><code>=</code><code>"Button1"</code> <code>type</code><code>=</code><code>"button"</code> <code>value</code><code>=</code><code>"确定"</code> <code>/> </</code><code>td</code><code>></</code><code>tr</code><code>></code>
<code> </code><code></</code><code>table</code><code>></code>
<code> </code>
<code> </code><code></</code><code>form</code><code>></code>
<code></</code><code>body</code><code>></code>
<code></</code><code>html</code><code>></code>
親你懂了吧~~~~~~~
3)後端僞驗證:
哎,為什麼要加個“僞”呐因為如果不是js你也沒辦法阻止表單的送出,而且表單送出後也沒有什麼驗證,就是在驗證使用者登入的時候你是沒辦法攔截使用者的登入資訊提取驗證碼的
缺點:類似前端js 驗證
demo:先上效果圖:
<a target="_blank" href="http://blog.51cto.com/attachment/201309/135115470.png"></a>
廢話不多說了,貼出流程:
在IIS中找到Exchange登入界面頁面的實體路徑,找到頁面logon.aspx,添加如下代碼:
<code><!----------------------------------------------------------- start 驗證碼 ---------------------------------------------------------------------></code>
<code><</code><code>tr</code><code>><</code><code>td</code> <code>nowrap><</code><code>label</code> <code>for</code><code>=</code><code>"yzm"</code><code>>驗證碼:</</code><code>label</code><code>></</code><code>td</code><code>><</code><code>td</code> <code>class</code><code>=</code><code>"txtpad"</code><code>><</code><code>input</code> <code>type</code><code>=</code><code>'text'</code> <code>class</code><code>=</code><code>'txt'</code> <code>maxlength</code><code>=</code><code>"4"</code> <code>style</code><code>=</code><code>"width:220px;"</code> <code>id</code><code>=</code><code>'yzm'</code> <code>/></code>
<code><</code><code>img</code> <code>src</code><code>=</code><code>'GetImg.aspx'</code> <code>alt</code><code>=</code><code>"點選切換驗證碼"</code> <code>title</code><code>=</code><code>"點選切換驗證碼"</code> <code>style</code><code>=</code><code>" margin-top:2px; vertical-align:top;cursor:pointer;"</code> <code>'GetImg.aspx');return false;" /></</code><code>td</code><code>></code>
<code></</code><code>tr</code><code>></code>
<code> </code><code><!----------------------------------------------------------- end 驗證碼 ---------------------------------------------------------------------></code>
你懂得,具體位置有你定,然後加入以下js代碼(這個位置随意):
<code><!------------------------------------------ 驗證碼 腳本 ------------------------------------------------------------></code>
<code><script type=</code><code>"text/javascript"</code> <code>src=</code><code>"jquery-1.7.1.min.js"</code><code>></script></code>
<code><script type=</code><code>"text/javascript"</code><code>></code>
<code>function</code> <code>ToggleCode(obj, codeurl) {</code>
<code> </code><code>$(obj).attr(</code><code>"src"</code><code>, codeurl + </code><code>"?time="</code> <code>+ Math.random());</code>
<code>}</code>
<code>var</code> <code>bo=</code><code>false</code><code>;</code>
<code>$(document).ready(</code><code>function</code><code>(){</code>
<code> </code><code>$(</code><code>".btn"</code><code>).before(</code><code>"<label id='spanMsg' style='color:red;padding-right:50px;'> </label>"</code><code>);</code>
<code> </code><code>$(</code><code>".btn"</code><code>).click(</code><code>function</code><code>(){</code>
<code> </code><code>if</code><code>(bo){</code>
<code> </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>var</code> <code>codeVaule=$(</code><code>"#yzm"</code><code>).val();</code>
<code> </code><code>if</code><code>(codeVaule==</code><code>""</code><code>){</code>
<code> </code><code>$(</code><code>"#spanMsg"</code><code>).html(</code><code>"*驗證碼不能為空!"</code><code>);</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>}</code><code>else</code> <code>if</code><code>(codeVaule.length!=4){</code>
<code> </code><code>$(</code><code>"#spanMsg"</code><code>).html(</code><code>"*驗證碼位數不夠!"</code><code>);</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>$.get(</code><code>"VerifyCode.aspx?yzmc="</code><code>+codeVaule,{},</code><code>function</code><code>(data){</code>
<code> </code><code>if</code><code>(data==</code><code>"ok"</code><code>){</code>
<code> </code><code>$(</code><code>"#spanMsg"</code><code>).html(</code><code>"*驗證碼正确!"</code><code>);</code>
<code> </code><code>$(</code><code>".btn"</code><code>).click();</code>
<code> </code><code>bo=</code><code>true</code><code>;</code>
<code> </code><code>}</code><code>else</code><code>{</code>
<code> </code><code>$(</code><code>"#spanMsg"</code><code>).html(</code><code>"*驗證碼錯誤!"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>});</code>
<code> </code><code>return</code> <code>bo;</code>
<code> </code>
<code> </code><code>});</code>
<code>});</code>
<code></script></code>
<code><!------------------------------------------- end 驗證碼 腳本 -----------------------------------------------------------></code>
然後在logon.aspx同一目錄下添加jquery-1.7.1.min.js檔案具體是什麼版本的jquery你可以任意選擇,應該都能相容。注意js代碼的引用名稱一緻。然後添加GetImg.aspx檔案代碼如下:
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
<code><%@ Page Language=</code><code>"C#"</code> <code>AutoEventWireup=</code><code>"true"</code> <code>%></code>
<code><%@ Import Namespace=</code><code>"System.Drawing"</code> <code>%></code>
<code><%@ Import Namespace=</code><code>"System.Drawing.Imaging"</code> <code>%></code>
<code><%@ Import Namespace=</code><code>"System.IO"</code> <code>%></code>
<code><%@ Import Namespace=</code><code>"System.Security.Cryptography"</code> <code>%></code>
<code><script runat=</code><code>"server"</code><code>></code>
<code> </code><code>public</code> <code>static</code> <code>string Encrypt(string Text)</code>
<code> </code><code>{</code>
<code> </code><code>string sKey = </code><code>"nysoftland.com.cn"</code><code>;</code>
<code> </code><code>DESCryptoServiceProvider des = </code><code>new</code> <code>DESCryptoServiceProvider();</code>
<code> </code><code>byte[] inputByteArray;</code>
<code> </code><code>inputByteArray = Encoding.Default.GetBytes(Text);</code>
<code> </code><code>des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, </code><code>"md5"</code><code>).Substring(</code><code>0</code><code>, </code><code>8</code><code>));</code>
<code> </code><code>des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, </code><code>"md5"</code><code>).Substring(</code><code>0</code><code>, </code><code>8</code><code>));</code>
<code> </code><code>System.IO.MemoryStream ms = </code><code>new</code> <code>System.IO.MemoryStream();</code>
<code> </code><code>CryptoStream cs = </code><code>new</code> <code>CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);</code>
<code> </code><code>cs.Write(inputByteArray, </code><code>0</code><code>, inputByteArray.Length);</code>
<code> </code><code>cs.FlushFinalBlock();</code>
<code> </code><code>StringBuilder ret = </code><code>new</code> <code>StringBuilder();</code>
<code> </code><code>foreach (byte b </code><code>in</code> <code>ms.ToArray())</code>
<code> </code><code>ret.AppendFormat(</code><code>"{0:X2}"</code><code>, b);</code>
<code> </code><code>return</code> <code>ret.ToString();</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>static</code> <code>string Decrypt(string Text)</code>
<code> </code><code>string sKey = </code><code>"Exchange"</code><code>;</code>
<code> </code><code>int</code> <code>len;</code>
<code> </code><code>len = Text.Length / </code><code>2</code><code>;</code>
<code> </code><code>byte[] inputByteArray = </code><code>new</code> <code>byte[len];</code>
<code> </code><code>int</code> <code>x, i;</code>
<code> </code><code>for</code> <code>(x = </code><code>0</code><code>; x < len; x++)</code>
<code> </code><code>i = Convert.ToInt32(Text.Substring(x * </code><code>2</code><code>, </code><code>2</code><code>), </code><code>16</code><code>);</code>
<code> </code><code>inputByteArray[x] = (byte)i;</code>
<code> </code><code>CryptoStream cs = </code><code>new</code> <code>CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);</code>
<code> </code><code>return</code> <code>Encoding.Default.GetString(ms.ToArray());</code>
<code> </code><code>protected</code> <code>void</code> <code>Page_Load(object sender, EventArgs e)</code>
<code> </code><code>int</code> <code>codeW = </code><code>80</code><code>;</code>
<code> </code><code>int</code> <code>codeH = </code><code>22</code><code>;</code>
<code> </code><code>int</code> <code>fontSize = </code><code>16</code><code>;</code>
<code> </code><code>string chkCode = string.Empty;</code>
<code> </code><code>Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };</code>
<code> </code><code>string[] font = { </code><code>"Times New Roman"</code><code>, </code><code>"Verdana"</code><code>, </code><code>"Arial"</code><code>, </code><code>"Gungsuh"</code><code>, </code><code>"Impact"</code> <code>};</code>
<code> </code><code>char[] character = { </code><code>'2'</code><code>, </code><code>'3'</code><code>, </code><code>'4'</code><code>, </code><code>'5'</code><code>, </code><code>'6'</code><code>, </code><code>'8'</code><code>, </code><code>'9'</code><code>, </code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'d'</code><code>, </code><code>'e'</code><code>, </code><code>'f'</code><code>, </code><code>'h'</code><code>, </code><code>'k'</code><code>, </code><code>'m'</code><code>, </code><code>'n'</code><code>, </code><code>'r'</code><code>, </code><code>'x'</code><code>, </code><code>'y'</code><code>, </code><code>'A'</code><code>, </code><code>'B'</code><code>, </code><code>'C'</code><code>, </code><code>'D'</code><code>, </code><code>'E'</code><code>, </code><code>'F'</code><code>, </code><code>'G'</code><code>, </code><code>'H'</code><code>, </code><code>'J'</code><code>, </code><code>'K'</code><code>, </code><code>'L'</code><code>, </code><code>'M'</code><code>, </code><code>'N'</code><code>, </code><code>'P'</code><code>, </code><code>'R'</code><code>, </code><code>'S'</code><code>, </code><code>'T'</code><code>, </code><code>'W'</code><code>, </code><code>'X'</code><code>, </code><code>'Y'</code> <code>};</code>
<code> </code><code>Random rnd = </code><code>new</code> <code>Random();</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>4</code><code>; i++)</code>
<code> </code><code>chkCode += character[rnd.Next(character.Length)];</code>
<code> </code><code>//Session["yzmCode"] = chkCode;</code>
<code> </code><code>HttpCookie cook = </code><code>new</code> <code>HttpCookie(</code><code>"yzmCode"</code><code>, Encrypt(chkCode));</code>
<code> </code><code>cook.Expires = DateTime.Now.AddMinutes(</code><code>20</code><code>);</code>
<code> </code><code>Response.Cookies.Add(cook);</code>
<code> </code><code>Bitmap bmp = </code><code>new</code> <code>Bitmap(codeW, codeH);</code>
<code> </code><code>Graphics g = Graphics.FromImage(bmp);</code>
<code> </code><code>g.Clear(Color.White);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>1</code><code>; i++)</code>
<code> </code><code>int</code> <code>x1 = rnd.Next(codeW);</code>
<code> </code><code>int</code> <code>y1 = rnd.Next(codeH);</code>
<code> </code><code>int</code> <code>x2 = rnd.Next(codeW);</code>
<code> </code><code>int</code> <code>y2 = rnd.Next(codeH);</code>
<code> </code><code>Color clr = color[rnd.Next(color.Length)];</code>
<code> </code><code>g.DrawLine(</code><code>new</code> <code>Pen(clr), x1, y1, x2, y2);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < chkCode.Length; i++)</code>
<code> </code><code>string fnt = font[rnd.Next(font.Length)];</code>
<code> </code><code>Font ft = </code><code>new</code> <code>Font(fnt, fontSize);</code>
<code> </code><code>g.DrawString(chkCode[i].ToString(), ft, </code><code>new</code> <code>SolidBrush(clr), (float)i * </code><code>18</code> <code>+ </code><code>2</code><code>, (float)</code><code>0</code><code>);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>100</code><code>; i++)</code>
<code> </code><code>int</code> <code>x = rnd.Next(bmp.Width);</code>
<code> </code><code>int</code> <code>y = rnd.Next(bmp.Height);</code>
<code> </code><code>bmp.SetPixel(x, y, clr);</code>
<code> </code><code>Response.Buffer = </code><code>true</code><code>;</code>
<code> </code><code>Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(</code><code>0</code><code>);</code>
<code> </code><code>Response.Expires = </code><code>0</code><code>;</code>
<code> </code><code>Response.CacheControl = </code><code>"no-cache"</code><code>;</code>
<code> </code><code>Response.AppendHeader(</code><code>"Pragma"</code><code>, </code><code>"No-Cache"</code><code>);</code>
<code> </code><code>MemoryStream ms = </code><code>new</code> <code>MemoryStream();</code>
<code> </code><code>try</code>
<code> </code><code>bmp.Save(ms, ImageFormat.Png);</code>
<code> </code><code>Response.ClearContent();</code>
<code> </code><code>Response.ContentType = </code><code>"image/Png"</code><code>;</code>
<code> </code><code>Response.BinaryWrite(ms.ToArray());</code>
<code> </code><code>finally</code>
<code> </code><code>bmp.Dispose();</code>
<code> </code><code>g.Dispose();</code>
在第72行的時候不适用session驗證,因為Exchange安裝後使用的不是Session驗證機制,是以我們在73~75行采用Cookies驗證機制。以上代碼用于生成驗證碼。
下邊采用jquery異步驗證機制驗證 驗證碼填寫是否正确,同樣添加VerifyCode.aspx檔案代碼如下:
<code><%@ Page Language=</code><code>"C#"</code> <code>AutoEventWireup=</code><code>"true"</code> <code>%></code>
<code> </code><code>protected</code> <code>void</code> <code>Page_Load(</code><code>object</code> <code>sender, EventArgs e)</code>
<code> </code><code>if</code> <code>(Request.Cookies[</code><code>"yzmCode"</code><code>] != </code><code>null</code><code>&&Request.QueryString[</code><code>"yzmc"</code><code>]!=</code><code>null</code><code>)</code>
<code> </code><code>string</code> <code>code = Decrypt(Request.Cookies[</code><code>"yzmCode"</code><code>].Value).ToUpper();</code>
<code> </code><code>string</code> <code>ucode = Request.QueryString[</code><code>"yzmc"</code><code>].ToUpper();</code>
<code> </code><code>if</code> <code>(code == ucode)</code>
<code> </code><code>{</code>
<code> </code><code>Response.Write(</code><code>"ok"</code><code>);</code>
<code> </code><code>Response.End();</code>
<code> </code><code>else</code>
<code> </code><code>Response.Write(</code><code>"error"</code><code>);</code>
<code> </code><code>else</code>
<code> </code><code>Response.Write(</code><code>"error2"</code><code>);</code>
<code> </code><code>Response.End();</code>
<code> </code><code>public</code> <code>static</code> <code>string</code> <code>Decrypt(</code><code>string</code> <code>Text)</code>
<code> </code><code>string</code> <code>sKey = </code><code>"Exchange"</code><code>;</code>
<code> </code><code>len = Text.Length / 2;</code>
<code> </code><code>byte</code><code>[] inputByteArray = </code><code>new</code> <code>byte</code><code>[len];</code>
<code> </code><code>for</code> <code>(x = 0; x < len; x++)</code>
<code> </code><code>i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);</code>
<code> </code><code>inputByteArray[x] = (</code><code>byte</code><code>)i;</code>
<code> </code><code>des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, </code><code>"md5"</code><code>).Substring(0, 8));</code>
<code> </code><code>des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, </code><code>"md5"</code><code>).Substring(0, 8));</code>
<code> </code><code>cs.Write(inputByteArray, 0, inputByteArray.Length);</code>
到此我們的代碼就已經填寫完畢了
總結:
有很好的asp.net底層基礎遇到問題還是能解決的挺順手的。不過說白了這些都是表面現象,你無法重寫Exchange編譯好的dll,也就是說想繞過你的驗證還是很容易的,這些都隻是忽悠使用者拔了,如果想更安全就要修改IIS,在Exchange登入時再包裝一層是使用者無法繞過驗證碼的驗證,隻不過本次需求不需要這麼高的安全性,能用好看就行...
歡迎諸位大神拍磚。。。。
本文轉自 tongling_zzu 51CTO部落格,原文連結:http://blog.51cto.com/tongling/1295069