五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Ajax訪問Xml Web Service的安全問題以及解決方案

Ajax訪問Xml Web Service的安全問題以及解決方案

文章來源:365jz.com     點(diǎn)擊數(shù):493    更新時(shí)間:2009-09-14 10:46   參與評(píng)論

在asp.net ajax中updatepanel比較常用,原本需要刷新的操作套在updatepanel中就成了ajax操作了,挺帥!但ajax也是支持與Xml Web Service交互的,這種方法更像是傳統(tǒng)的ajaxpro和其他ajax框架,如jquery,magicajax,extjs的風(fēng)格,但MS總是獨(dú)樹一幟,誰讓他的產(chǎn)品設(shè)計(jì)能力那么高呢!我輩恐怕望塵莫及亞.閑話少敘,下面簡單講述下asp.net ajax如何調(diào)用xml web service,熟悉的朋友就略過吧

1. 創(chuàng)建一個(gè)支持Asp.Net Ajax的網(wǎng)站或者網(wǎng)絡(luò)應(yīng)用程序,我使用的是vs2008,在vs2008中,如果建立的網(wǎng)站支持.net framework 3.5就有ajax的缺省支持,這陳芝麻,爛谷子的事情,也不多說。

2. 建立好項(xiàng)目之后,在網(wǎng)站根目錄中添加一個(gè)Web服務(wù)UserService.asmx,在UserService.asmx中添加如下方法:

[WebMethod] 
public bool UserAdd(string userName,string
 pwd) 

return true

}
 

注意服務(wù)類上部要添加Attribute

[System.Web.Script.Services.ScriptService]

3. 然后把default.aspx中的ScriptManager修改成如下代碼的德性:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 

<Services>
 

<asp:ServiceReference Path="UserService.asmx" />
 

</Services>
 
</asp:ScriptManager>
 

下面我們就在頁面中創(chuàng)建用Ajax消費(fèi)這個(gè)UserService的代碼:主要包括如下: 

<h2>Ajax調(diào)用Xml Web Service示例1</h2> 

<div style="border: 1px solid Black; width: 50%; padding: 10px;">
 

<table class="style1">
 

<tr>
 

<td>
 

用戶名: 

</td>
 

<td>
 

<input id="txtName" type="text" />
 

</td>
 

</tr>
 

<tr>
 

<td>
 

密碼: 

</td>
 

<td>
 

<input id="txtPwd" type="password" />
 

</td>
 

</tr>
 

<tr>
 

<td>
 

&nbsp;
 

</td>
 

<td>
 

<input id="Button2" type="button" value="提交" onclick="userAdd()" />
 

</td>
 

</tr>
 

</table>
 

</div>
 

在<head></head>添加如下腳本

function userAdd() 



var name = $get("txtName"
).value; 

var pwd = $get("txtPwd"
).value; 

AjaxWs.UserService.UserAdd(name,pwd,userAddCallBack); 

}
 

function
 userAddCallBack(res) 



alert(res); 

}
 

4. 好,現(xiàn)在一個(gè)簡單的ajax調(diào)用web service的示例代碼已經(jīng)搞定,羅索了不少,其實(shí)簡單的不能再簡單,運(yùn)行頁面,點(diǎn)擊提交按鈕,效果如下:

表示成功。一般人這一步都會(huì)成功的。二般的除外亞,:)  

一些正常,那是不是到這里就萬事大吉,ajax萬歲!web service真好!下面是略加思考之后的問題  

問題一:

上面的Xml Web Service沒有任何保護(hù),如果UserAdd是一個(gè)數(shù)據(jù)庫插入操作,那這個(gè)操作往往系統(tǒng)只被經(jīng)過授權(quán)的人才能調(diào)用成功。以前看有朋友討論ajax如何調(diào)用帶有SoapHeader的xml web service,細(xì)細(xì)想想,其實(shí)沒什么必要!js是客戶端的東西,是放出去收不回來的玩意,天知道用戶是哪路貨色 ,如果將身份信息試圖通過js傳遞給SoapHeader,那密碼被截獲的可能性就比較大。正確的做法其實(shí)是Session .我們知道Web Service方法中添加一個(gè)[WebMethod(EnableSession=true)]就能使用Session了,Session這家伙專門用于保持會(huì)話,有這樣一個(gè) 認(rèn)識(shí)之后,新增一個(gè)網(wǎng)絡(luò)服務(wù)方法,這個(gè)方法實(shí)現(xiàn)功能和起初的UserAdd一致,只是添加上訪問限制

[WebMethod(EnableSession=true)] 

public bool UserAddSecurity(string userName, string pwd) 



if (Session["UserID"== null




return false


}
 

return true


}
 

在頁面中將AjaxWs.UserService.UserAdd(name,pwd,userAddCallBack);更改為AjaxWs.UserService.UserAddSecurity(name,pwd,userAddCallBack);點(diǎn)擊提交按鈕,會(huì)發(fā)現(xiàn)彈出結(jié)果為false!

在頁面中添加一個(gè)按鈕,點(diǎn)擊這個(gè)按鈕模擬登陸,點(diǎn)擊代碼為:

protected void Button3_Click(object sender, EventArgs e) 



Session[
"UserID"= "jillzhang"


}
 

點(diǎn)擊登陸按鈕后,再次點(diǎn)擊提交,便可以返回true。 這樣便限制了用戶對(duì)xml web service的訪問。達(dá)到了解決問題一的目的。  

問題二:

這個(gè)問題涉及到xml web service架構(gòu)的缺陷,這個(gè)缺陷在WCF中已經(jīng)有所更正和彌補(bǔ)。我們知道web service是一種強(qiáng)度公開和共享的技術(shù),之所以稱之為服務(wù),必然是提供給其他應(yīng)用程序所使用。但事實(shí)上,有很多服務(wù)是服務(wù)于局部或者特殊個(gè)體的,而不是理想中的大眾。而在原來老的xml web service中,wsdl的發(fā)布與網(wǎng)絡(luò)服務(wù)的發(fā)布是綁在一起的,我將.asmx部署到iis中,那在這個(gè).asmx后加上?wsdl就能訪問服務(wù)的wsdl。wsdl是對(duì)服務(wù)的描述,知道它,便能開發(fā)客戶代理,從而消費(fèi)服務(wù),但這樣有問題:我的服務(wù)只想讓局部或者特殊的幾個(gè)人知道 ,其他人根本不想讓其訪問到。這就麻煩了。我發(fā)布.asmx,wsdl就發(fā)布。而wsdl的發(fā)現(xiàn)依靠的是UDDI,通過下面的一段描述:

UDDI 如何被使用

假如行業(yè)發(fā)布了一個(gè)用于航班比率檢測和預(yù)訂的 UDDI 標(biāo)準(zhǔn),航空公司就可以把它們的服務(wù)注冊到一個(gè) UDDI 目錄中。然后旅行社就能夠搜索這個(gè) UDDI 目錄以找到航空公司預(yù)訂界面。當(dāng)此界面被找到后,旅行社就能夠立即與此服務(wù)進(jìn)行通信,這樣由于它使用了一套定義良好的預(yù)訂界面。

如果遍歷UDDI目錄,不難發(fā)現(xiàn)WSDL,發(fā)現(xiàn)WSDL后便可以開發(fā)客戶端與服務(wù)交互。這可不是好事情,在問題一中,用授權(quán)的方法可以解決一種問題,但假如我的服務(wù)是這樣的,它返回服務(wù)器當(dāng)前時(shí)間,這個(gè)方法對(duì)于我網(wǎng)站的用戶而言是公開的,如果生硬的加上Session,有些麻煩。但這個(gè)服務(wù)我只希望我自己的ajax能訪問,不希望別人發(fā)現(xiàn)并調(diào)用,但原來的xml web service架構(gòu)的確不能滿足這個(gè)需求。如果被一個(gè)攻擊者發(fā)現(xiàn),他可能會(huì)根據(jù)公開的wsdl開發(fā)客戶端,然后不停的DDOS攻擊,災(zāi)難!

上面這個(gè)問題對(duì)于原來的web service,我還是沒有好的解決方案,當(dāng)然不代表沒有解決方案。有朋友知道,勞煩指教。

但對(duì)于WCF架構(gòu),就充分考慮到上面這個(gè)問題了。看看下面老的Xml Web Service架構(gòu)與WCF架構(gòu)之間的對(duì)比:

1) 老架構(gòu)

 

2) 新架構(gòu)

 
區(qū)別很明顯,老架構(gòu)MEX與業(yè)務(wù)耦合度非常高,儼然一體,而新的架構(gòu)卻將兩者份將開來,分而不僵,反而會(huì)增加靈活性。如果是WCF開發(fā)的服務(wù),在發(fā)布網(wǎng)站的時(shí)候,完全可以通過配置,將MEX終結(jié)點(diǎn)去掉,這樣就可以解決上面的問題。具體實(shí)例下文討論,有點(diǎn)困了,睡! 

 附上示例項(xiàng)目:

/Files/jillzhang/AjaxWs.rar

 

如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (493人查看,0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)