WCF 自訂使用者帳號/密碼篇(二):使用者認證的WCF服務—範例服務程式庫(WCF Library)

  • 3873
  • 0
  • WCF
  • 2022-09-18

使用者認證的WCF服務—範例服務程式庫(WCF Library)

目錄:WCF 自訂使用者帳號/密碼篇

 

在之後介紹的WCF使用者自訂帳號密碼認證所用到的WCF程式﹐都是參考到這裏所建置的WCF服務程式庫。WCF 主要透過設定來達成許多目的而不需要修改程式邏輯﹐這點WCF做的還不錯。

 

MyProducts.lib 專案

這個服務程式庫的專案只是為了測試WCF的呼叫﹐因此建立的方法很單純﹐一個測試資料的傳入/傳出及一個使用WCF自訂類別。

這個專案只有以下3個類別檔

Product.cs 自訂類別(DataContract 資料合約)

IProductService.cs (ServiceContract 服務合約)

ProductService.cs (實做服務)

這個專案編譯之後產生的檔案為MyProducts.lib.dll﹐後續不論使用IIS﹑WindForm 或者 Windows 服務做為載具﹐都可直接參考這個 dll 檔提供WCF服務。

 

Product.cs

   1:  namespace MyProducts.lib {
   2:      [DataContract]
   3:      public class Product {
   4:          /// <summary>
   5:          /// 產品編號
   6:          /// </summary>
   7:          [DataMember]
   8:          public string No { get; set; }
   9:          /// <summary>
  10:          /// 產品名稱
  11:          /// </summary>
  12:          [DataMember]
  13:          public string Name { get; set; }
  14:          /// <summary>
  15:          /// 單價
  16:          /// </summary>
  17:          [DataMember]
  18:          public int Price { get; set; }
  19:          /// <summary>
  20:          /// 數量
  21:          /// </summary>
  22:          [DataMember]
  23:          public int Quantity { get; set; }
  24:      }
  25:  }

 

 

IProductService.cs

   1:  namespace MyProducts.lib {
   2:      [ServiceContract]
   3:      public interface IProductService {
   4:          [OperationContract]
   5:          string SaySomething(string value);
   6:  
   7:          [OperationContract]
   8:          Product GetProduct(string productNo);
   9:      }
  10:  }

 

 

ProductService.cs

   1:  namespace MyProducts.lib {
   2:      public class ProductService : IProductService {
   3:          List<Product> ProductList = new List<Product>();
   4:  
   5:          #region IProductService 成員
   6:          public string SaySomething(string value) {
   7:              return "You say [" + value + "].";
   8:          }
   9:  
  10:          public Product GetProduct(string productNo) {
  11:              MakeProductData();
  12:  
  13:              Product product = new Product();
  14:              try {
  15:                  var result = from p in ProductList
  16:                               where p.No == productNo
  17:                               select p;
  18:                  foreach (Product p in result) {
  19:                      product.No = p.No;
  20:                      product.Name = p.Name;
  21:                      product.Price = p.Price;
  22:                      product.Quantity = p.Quantity;
  23:                  }
  24:              } catch (Exception er) {
  25:                  throw new FaultException(er.Message);
  26:              }
  27:  
  28:              return product;
  29:          }
  30:          #endregion
  31:  
  32:          /// <summary>
  33:          /// 產生測試資料
  34:          /// </summary>
  35:          private void MakeProductData() {
  36:              Product p1 = new Product();
  37:              p1.No = "P-001";
  38:              p1.Name = "Microsoft Windows communication Foundation 新一代應用程式通訊架構";
  39:              p1.Price = 680;
  40:              p1.Quantity = 100;
  41:              ProductList.Add(p1);
  42:  
  43:              Product p2 = new Product();
  44:              p2.No = "P-002";
  45:              p2.Name = "Arduino 開發實戰指南 AVR篇";
  46:              p2.Price = 240;
  47:              p2.Quantity = 120;
  48:              ProductList.Add(p2);
  49:          }
  50:      }
  51:  }

 

 

UserAuthorization.lib 專案

這一個專案下只會建立一個類別﹐這個將在我們WCF自訂使用者帳號密碼認證中扮演重要的角色。

UserValidator.cs

   1:  namespace UserAuthorization.lib {
   2:      public class UserValidator : UserNamePasswordValidator {
   3:          public override void Validate(string userName, string password) {
   4:              if (userName == null || password == null) {
   5:                  throw new ArgumentNullException();
   6:              } else {
   7:                  if (!(userName == "testman" && password == "a0987")) {
   8:                      throw new FaultException("帳號密碼錯誤。");
   9:                  }
  10:              }
  11:          }
  12:      }
  13:  }

 

這一個類別繼承了 UserNamePasswordValidator 用來驗證使用者的帳號和密碼﹐必須要參考System.IdentityModel 及 System.IdentityModel.Selectors。