用WSE在Web服務中驗證使用者身份(2)

來源:互聯網
上載者:User
五、IPasswordProvider介面

WSE定義了一個 Microsoft.Web.Services.Security.IPasswordProvider介面類,我們必須實現這個類來註冊一個密碼提供者。這個介面有一個方法GetPassword,它接收一個 Microsoft.Web.Services.Security.UsernameToken作為輸入參數,該方法返回指定使用者的密碼。其思想是你可以使用任何你想用的機制儲存有效使用者名稱/密碼對,然後提供了一個實現IPasswordProvider介面的類,來讓WSE訪問你的特定密碼儲存機制。你甚至可以執行你自己的UsernameToken的摘要(Digest)和散列(Hash)的組合,甚至使用一個共用的密碼,以進一步控制你的認證基礎結構。

為了把你特定的Password Provider(密碼提供者)告訴WSE,你必須配置合適的WSE設定。首先要添加一個Microsoft.Web.Services元素到應用程式的設定檔中的配置元素中。還要指定可以讀懂特定配置資訊的WSE類。可以把下面的configSections添加到機器上的Machine.config或單獨的Web.config中。

<configSections><section name="microsoft.web.services"type="Microsoft.Web.Services.Configuration.WebServicesConfiguration,Microsoft.Web.Services, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /></configSections>

在本例中,我們將使用Northwind資料庫Employees表的一個修改版本來進行查詢任務。因為PasswordProvider介面需要返回一個與UsernameToken對象的密碼部分匹配的實際密碼,所以通常,我們只需要使用WSE加密我們的使用者名稱和密碼,然後再通過網路傳送給Web服務。

如果你在Solution Explorer中選中你的工程並在其上點擊右鍵,你將看到在底部增加了一個新的菜單“WSE Settings”,你可以在其中設定所有重要的配置和其它使用WSE的配置:

這可讓我們很容易的設定Password Provider Implementation(密碼提供者實現)元素,Decryption Key Provider Implementation(解密鑰提供者)元素,X.509 Certificate(X.509 憑證)設定,甚至是我們希望使用的Binary Security Tokens(二進位安全令牌)。此外,其他的選項卡還可以配置用於WSE管道的輸入輸出過濾器,配置路由,啟動診斷功能等等。雖然它不能做我們想做的每件事,但這是WSE易用化的一個良好的開端。

PasswordProvider安全元素是web.config中的<configuration>父元素的一個子項目,它告訴WSE你使用哪個類來實現PasswordProvider介面:

<microsoft.web.services> <security><!-- NAMESPACE . CLASSNAME , ASSEMBLYNAME --><passwordProvider type="WSESecurity.WSEPasswordProvider, WSESecurity" /> </security></microsoft.web.services>

讓我們看看在本例中如何?它:

namespace WSESecurity{ public class WSEPasswordProvider : IPasswordProvider {public string GetPassword(UsernameToken token){ try {SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["SqlConn"].ToString());cn.Open();SqlCommand cmd = new SqlCommand("SELECT Username, password from Employees where username ='" + token.Username + "'",cn);SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);dr.Read();return dr["password"].ToString(); }  catch(Exception ex) {throw new Exception (ex.Message); } } }}

上面我們給出的代碼可以完全實現IPasswordProvider介面,通過使用者名稱/密碼來驗證一個使用者,當然了,還可以把它做得更複雜一些,這請讀者們自己去完成。實際上,我們在編程的過程中基本沒有寫太多使用者驗證的代碼,大部分工作都由WSE暗中處理了。

WebMethod]public DataSet CustOrderHist(string CustId){ // 只接受 SOAP格式的請求 SoapContext requestContext = HttpSoapContext.RequestContext; if(requestContext==null) {throw new ApplicationException("Non-SOAP request!"); } bool valid=false; try {foreach(SecurityToken tkn in requestContext.Security.Tokens){ if(tkn is UsernameToken) valid=true; }  }  catch(Exception ex) {throw new Exception( ex.Message + ": " + ex.InnerException.Message); }  if (valid==false)throw new ApplicationException("Invalid or Missing Security Token."); SqlConnection cn; SqlDataAdapter da; DataSet ds;  cn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["SqlConn"].ToString()); cn.Open(); da = new SqlDataAdapter("custorderHist '" +CustId + "'", cn); ds = new DataSet(); da.Fill(ds, "CustOrderHist"); return ds;}

使用上面的WebMethod,我們就可在伺服器上實現驗證使用者名稱/密碼的操作。WebMethod必須引用Microsoft.Web.Services和 Microsoft.Web.Services.Security網域名稱空間。現在,我們要構建一個ASP.NET用戶端,這個用戶端能夠發送驗證所需的 SOAP頭,並可調用我們的Web服務方法。

七、構建WSE ASP.NET用戶端

對於用戶端,WSE提供了繼承於System.Web.Services.Protocols.SoapHttpClientProtocol類的 Microsoft.Web.Services.WebServicesClientProtocol類。當你在Visual Studio.NET中選擇“Add Web Reference”選項的時候,或者使用WSDL.exe程式建立基於WSDL的用戶端代碼時,你需要使用 SoapHttpClientProtocol類。你可做的就是使用Visual Studio.NET中的“Add Web Reference”選項或者WSDL.exe程式為你的用戶端組建代理程式類,然後把代理類從繼承於SoapHttpClientProtocol改為繼承於WebServicesClientProtocol。這樣代理類就有了RequestSoapContext和 ResponseSoapContext屬性,你可以使用它們訪問你發送或接收的WS-Security頭。在C#工程中,如果你已經使用了“Add Web Reference”選項,你可以點擊Solution Explorer中的“Show All Files”按鈕,點擊這個按鈕就可在Solution Explorer的Web References結點中顯示Reference.cs檔案,讓你可以編輯這個檔案。

為了建立正確的UsernameToken和在訊息級調用Web服務的代理方法,需要使用下面的代碼:

private void Button1_Click(object sender, System.EventArgs e){  localhost.SecurityServiceWse wse=new localhost.SecurityServiceWse(); UsernameToken tkn = new UsernameToken(txtUsername.Text,txtPassword.Text,PasswordOption.SendHashed); wse.RequestSoapContext.Security.Tokens.Add (tkn); try {DataSet ds=wse.CustOrderHist(txtCustID.Text);DataGrid1.DataSource=ds;DataGrid1.DataBind(); } catch(Exception ex) {DataGrid1.Visible=false;lblMessages.Text=ex.Message; }}

我們要做的就是從用戶端的兩個文本輸入框txtUsername和txtPassword中取得輸入字串,然後使用 PasswordOption.SendHashed把它們結合起來建立一個有效UserNameToken。當調用Web服務時,WSE SOAP擴充驗證請求的一般格式,然後核對密碼散列並從我們的PasswordProvider方法中取得的密碼。如果兩者匹配,我們就可調用Web服務方法,用戶端返回資料集,顯示在一個網格中。

我們現在已經建立了一個完整的使用WSE配合資料庫驗證SHA1摘要散列使用者名稱/密碼的Web服務,希望讀者們能通過本文瞭解到使用WSE保證Web服務安全的基本措施和方法,並能在實際工作中合理的去應用。

在文章的最後,我們給出修改Northwind資料庫Employees表的SQL指令碼,給這個表添加了所需的username和password列,同時在這個表中插入了一條新紀錄,其Firstname、Lastname、Username、Password和roles欄位分別為 “User”,“One”,“user1”,“pass1”和“user”。

USE NORTHWINDGOALTER TABLE [dbo]. ADD [Username] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,[Password] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,[roles] [varchar] (250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL GOINSERT INTO EMPLOYEES (Firstname, Lastname,Username, [Password], roles)VALUES('User','One', 'user1', 'pass1', 'user')GO

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.