應用WSDK - 實踐Web Services的數字簽名(上) (轉)

amyz發表於2007-10-17
應用WSDK - 實踐Web Services的數字簽名(上) (轉)[@more@]

應用WSDK - 實踐 Services的數字簽名:namespace prefix = o ns = "urn:schemas--com::office" />

 


小氣的神

2002-12-05

Article Type: In-Depth 

難度等級:8.2/9 

版本:1.36

  老實說有關Security()的話題,從來不是我的強項,如果可以我寧願多說一些有關企業級應用開發、有關、COM+的話題。不過Web Services是我喜歡的、Inte是我喜歡的,所以有關Web Services的安全話題是不能逃避的,無論我對這方面多麼的貧乏,嘗試還是願意的。世界上的許多事情就是這麼奇妙的:我的老哥一心向往,不想畢業後卻去了海運局工作了很久;我的好友立志30歲才結婚,沒想到居然網戀成功,娶得一個貌美賢惠的網友,加上結婚生子現在也還是30未到;而我一直很喜歡廣州這座城市的氛圍,沒想到會迷上廣州的飲食,有好吃的城市才是美麗的城市:)

 

  Microsoft XML Web Services 的第一個版本,也就是我們現在用的最多的版本,沒有提供對P訊息進行安全方面處理的支援,也可以說那時s/understanding/default.x?pull=/library/en-us/dnglobspec/html/wssecurspecindex.asp">WS-Security 還沒完成。WSDK則增加了WS-Security的支援和處理。

 

  最簡單的說WS-Security主要提供了三個方面的機制來保護我們年輕的Web Services:

1.  Security token propagation (解決Security Credentials可以被在間進行傳播)

2.  Message integrity (對訊息是否在中間點是否被修改進行驗證[Verify])

3.  Message Confntiality ( 保證訊息在未前依然是機密有效的)

生活最通俗的解釋是透過戲劇來表現,比如《哈姆雷特》。哈姆雷特,這個在城堡中游蕩的著名,與丹麥國王克勞底斯對決,揚言要殺害許多城堡中居民,克勞底斯則決定幹掉哈姆雷特而一勞永逸;於是他派了親信羅森克勞茨和古登斯坦送哈姆雷特去英格蘭。他倆攜帶一封密信,信上要求一到英格蘭就立即將哈姆雷特處死,和哈姆雷特一起的旅途是漫長和極具挑戰性的,但是國王、羅森克勞茨和古登斯坦都忘了採取措施來保證:

1.  哈姆雷特不能閱讀這封信

2.  哈姆雷特到達英格蘭前不能修改這封信

最後這個著名的丹麥駭客,在另外兩人熟睡的時候,偷看了信的內容,輕易地將要處死的人改為熟睡的兩個國王親信,並且在信封上蓋上他父親前丹麥國王的印章。作為國王的兩個親信從未想過要看這份信的內容,而且也從未想到自己一到英格蘭就被處死。

 

那麼我們看到有關安全最基本的三個問題:

1.  丹麥國王克勞底斯要有辦法將信安全的送到英格蘭國王的手上。

2.  英格蘭國王如何驗證信的內容是否為原始信件。

3.  在英格蘭國王沒有開啟信件之前,信中的內容依然是高度機密的。

 

而當這些問題發生在Internet和Web Services就更有趣了,WS-Security就是完成這個功能的。(如果你哈姆雷特的故事感興趣,除了看這篇文件最早我是在安全性指南[Professional Java security]上看到的) 這篇文章也同樣是Web Services有關安全的開始,下面我們要做的就是上面將的第一個問題,解決Security Credentials在網路間進行傳遞的問題。

 

  我將利用WSDK來實踐一個Web Services的客戶端使用UsernameToken數字簽名一個SOAP 訊息,同時Web Services又是如何處理這個被UsernameToken簽名的訊息。我儘量簡化了有關的處理和流程,試圖說明整個的過程,從後面附帶的中你可以看到這一點。

 

  整個過程我們會生產一個Web Services和一個Web Services的客戶端,同時最多的還是進行一些。執行透過的環境 XP SP2 / VS.NET 1.0 / WSDK 5217+

生成端部分:

 

1.  建立一個Web Services 專案 SignSOAPusiame

 

2.  加入 Microsoft.Web.Services.DLL 引用。

 

3.  點選SignSOAPUsingName.asmx.cs 加入下面的程式碼:

 

using System.Web.Services.Protocols ;

using Microsoft.Web.Services.Security ;

using Microsoft.Web.Services;

using System.Security.Cryptography ;

4.  去到HelloWorld 的註釋程式碼並加入下面的程式碼:

 

[WebMethod]

public string HelloWorld()

{

  SoapContext requestContext = HttpSoapContext.RequestContext ;

  string retval = "User unknown" ;

  if ( requestContext == null )

  throw new ApplicationException( " Non-SOAP request" ) ;

  if ( !IsValid( requestContext ) )

  {

  throw new SoapException( "The security infomation Supplied was not valid .", new System.Xml.XmlQualifiedName("Bad Tokens", "" ) ) ;

  }

  UsernameToken theToken = GetUsernameToken( requestContext.Security  ) ;

  if ( theToken != null )

  {

  return "Hello " + theToken.Username  ;

  }

  return retval ;

}

5.  在web.config中配置WSDK的Microsoft.Web.WebServices

 

  <!-- type= 其內容必須保證在一行不能回車 --&gt

 

 

6.  加一個新的類實現 IPassProvider

 

using System;

using System.Security.Pessions ;

using System.Security.Cryptography ;

using Microsoft.Web.Services.Security ;

namespace SignSOAPUsingName

{

  [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.UnmanagedCode)]

  public class PasswordProvider : IPasswordProvider

  {

  HashAlgorithm hash ;

  public PasswordProvider()

  {

  hash = new SHA1CryptoServiceProvider() ;

    }

  public string GetPassword( string userName )

  {

  byte[] encodedUsername = System.Text.Encoding.UTF8.GetBytes( userName ) ;

  Array.Reverse(encodedUsername); //這裡我簡化了處理,先不考慮那些加密

  return Convert.ToBase64String(encodedUsername);

  }

  }

}

7.  在web.config中配置PasswordProvider

 

<!-- type=名稱空間.類名,集名 --&gt

 

8.  執行和Build應用程式,F5執行看Web Services是否正常執行

 

 


特別:

本文原創,CSDN署名首發,所有文字和圖片版權所有。未經授權請勿傳播、轉載或改編。

如果有問題或建議,to:請發電子給new2001@.com">請發電子郵件給new2001@msn.com

歡迎訪問我的WebSite:

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-977218/,如需轉載,請註明出處,否則將追究法律責任。

相關文章