天天看點

Exchange郵箱登陸界面添加驗證碼功能完美解決方案

前言:

   昨天思路錯誤,白忙了一上午因為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>&lt;</code><code>html</code> <code>xmlns</code><code>=</code><code>"http://www.w3.org/1999/xhtml"</code> <code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>title</code><code>&gt;無标題頁&lt;/</code><code>title</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>style</code> <code>type</code><code>=</code><code>"text/css"</code><code>&gt;</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>&lt;/</code><code>style</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>script</code> <code>language</code><code>=</code><code>"javascript"</code> <code>type</code><code>=</code><code>"text/javascript"</code><code>&gt;</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 &lt; </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 &lt;= 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>&lt;/script&gt;</code>

<code>&lt;/</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>body</code>     <code>&lt;form  </code><code>action</code><code>=</code><code>"#"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>table</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>tr</code><code>&gt;&lt;</code><code>td</code><code>&gt;姓 名:&lt;/</code><code>td</code><code>&gt;&lt;</code><code>td</code><code>&gt;&lt;</code><code>input</code> <code>type</code><code>=</code><code>"text"</code> <code>style</code><code>=</code><code>"width: 160px;"</code><code>/&gt;&lt;/</code><code>td</code><code>&gt;&lt;/</code><code>tr</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>tr</code><code>&gt;&lt;</code><code>td</code><code>&gt;密 碼:&lt;/</code><code>td</code><code>&gt;&lt;</code><code>td</code><code>&gt;&lt;</code><code>input</code> <code>type</code><code>=</code><code>"password"</code> <code>style</code><code>=</code><code>"width: 160px;"</code><code>/&gt;&lt;/</code><code>td</code><code>&gt;&lt;/</code><code>tr</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>tr</code><code>&gt;&lt;</code><code>td</code><code>&gt;驗證碼:&lt;/</code><code>td</code><code>&gt;&lt;</code><code>td</code><code>&gt;&lt;</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>/&gt;</code>

<code>        </code><code>&lt;</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>/&gt;&lt;/</code><code>td</code><code>&gt;&lt;/</code><code>tr</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>tr</code><code>&gt;&lt;</code><code>td</code><code>&gt;&lt;/</code><code>td</code><code>&gt;&lt;</code><code>td</code><code>&gt;&lt;</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>/&gt;   &lt;/</code><code>td</code><code>&gt;&lt;/</code><code>tr</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>table</code><code>&gt;</code>

<code>                                                                                                                                                                                                                                                                                                                                              </code> 

<code>    </code><code>&lt;/</code><code>form</code><code>&gt;</code>

<code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

親你懂了吧~~~~~~~

   3)後端僞驗證:

   哎,為什麼要加個“僞”呐因為如果不是js你也沒辦法阻止表單的送出,而且表單送出後也沒有什麼驗證,就是在驗證使用者登入的時候你是沒辦法攔截使用者的登入資訊提取驗證碼的

   缺點:類似前端js 驗證

demo:先上效果圖:

<a target="_blank" href="http://blog.51cto.com/attachment/201309/135115470.png"></a>

廢話不多說了,貼出流程:

在IIS中找到Exchange登入界面頁面的實體路徑,找到頁面logon.aspx,添加如下代碼:

<code>&lt;!----------------------------------------------------------- start 驗證碼 ---------------------------------------------------------------------&gt;</code>

<code>&lt;</code><code>tr</code><code>&gt;&lt;</code><code>td</code> <code>nowrap&gt;&lt;</code><code>label</code> <code>for</code><code>=</code><code>"yzm"</code><code>&gt;驗證碼:&lt;/</code><code>label</code><code>&gt;&lt;/</code><code>td</code><code>&gt;&lt;</code><code>td</code> <code>class</code><code>=</code><code>"txtpad"</code><code>&gt;&lt;</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>/&gt;</code>

<code>&lt;</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;" /&gt;&lt;/</code><code>td</code><code>&gt;</code>

<code>&lt;/</code><code>tr</code><code>&gt;</code>

<code>    </code><code>&lt;!----------------------------------------------------------- end 驗證碼 ---------------------------------------------------------------------&gt;</code>

你懂得,具體位置有你定,然後加入以下js代碼(這個位置随意):

<code>&lt;!------------------------------------------ 驗證碼 腳本 ------------------------------------------------------------&gt;</code>

<code>&lt;script type=</code><code>"text/javascript"</code>  <code>src=</code><code>"jquery-1.7.1.min.js"</code><code>&gt;&lt;/script&gt;</code>

<code>&lt;script type=</code><code>"text/javascript"</code><code>&gt;</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>"&lt;label id='spanMsg' style='color:red;padding-right:50px;'&gt; &lt;/label&gt;"</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>&lt;/script&gt;</code>

<code>&lt;!------------------------------------------- end 驗證碼 腳本 -----------------------------------------------------------&gt;</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>&lt;%@ Page Language=</code><code>"C#"</code> <code>AutoEventWireup=</code><code>"true"</code>  <code>%&gt;</code>

<code>&lt;%@ Import Namespace=</code><code>"System.Drawing"</code> <code>%&gt;</code>

<code>&lt;%@ Import Namespace=</code><code>"System.Drawing.Imaging"</code> <code>%&gt;</code>

<code>&lt;%@ Import Namespace=</code><code>"System.IO"</code> <code>%&gt;</code>

<code>&lt;%@ Import Namespace=</code><code>"System.Security.Cryptography"</code> <code>%&gt;</code>

<code>&lt;script runat=</code><code>"server"</code><code>&gt;</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 &lt; 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 &lt; </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 &lt; </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 &lt; 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 &lt; </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>&lt;%@ Page Language=</code><code>"C#"</code> <code>AutoEventWireup=</code><code>"true"</code> <code>%&gt;</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>&amp;&amp;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 &lt; 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

繼續閱讀