How To Use ASP.NET Role Membership In WCF 4.0 Security

WCF , Posted at : Aug/13/2011  
1967 Views   0 Comments

Security di WCF dapat di implementasikan dengan beberapa teknik yang harus disesuaikan salah satunya dengan environment yang digunakan seperti misalnya intranet atau internet. Sebut saja misalnya security di transport layer, message layer, penggunaan SSL, penggunaan certificate dan penggunaan asp.net role membership. Pada artikel kali ini saya akan membahas tentang penggunaan WCF security di lingkungan internet dimana implementasinya menggunakan asp.net role membership yang digunakan untuk melakukan autentikasi dan autorisasi di message layer.

Seperti yang sudah kita ketahui bahwa mulai di asp.net 2.0 microsoft telah menambahkan komponen baru untuk memudahkan pengaturan security di web yaitu dengan membuat asp.net role membership. Dengan komponen tersebut programmer dapat dengan mudah untuk melakukan autentikasi dan autorisasi di web site yang di bangun. Teknik tersebut akan kita gunakan di WCF.

Disini saya tidak akan menjelaskan tentang bagaimana caranya membuat contract, service implementation, transaction, fault message, wcf hosting. Pembahasan akan difokuskan ke penggunaan asp.net role membership di WCF. Tools dan environment yang digunakan yaitu Visual Studio 2010 (WCF 4.0), SQL Server 2008 Express, Windows 7, IIS 7.5.

Skenarionya yaitu kita akan membuat asp.net web site yang akan mengkonsumsi service di WCF. Di dalam web site tersebut terdapat satu halaman Orders.aspx yang digunakan untuk melakukan order barang terhadap produk yang dijual berdasarkan pesanan customer. Untuk melakukan order tersebut hanya dapat dilakukan oleh user yang berada di role tertentu yang sudah di definisikan. Database yang digunakan sebagai sample yaitu Northwind. Berikut adalah langkah-langkahnya :

1. Buat sebuah WCF Service Application yang di host di IIS dan beri nama NorthwindService.

2. Tambahkan LINQ To SQL kedalam project tersebut dan lakukan drag dan drop table Orders dan OrderDetail.

3. Buka Web Site Administration Tools (WAT), ubah jenis autentikasi menjadi From The Internet (Forms) dan tambahkan dua roles yaitu Administrators dan Users. Selain itu tambahkan dua user baru yaitu admin1 (Administrators) dan user1 (Users). Secara default data tersebut akan disimpan di database SQL Server Express yang disimpan di folder App_Data.

4. Buat sebuah service contract yang berisi operation contract untuk menambahkan data baru kedalam tabel Orders dan OrderDetail.

<ServiceContract()>
Public Interface INorthwind

    <OperationContract()>
    <FaultContract(GetType(NorthwindServiceFault))>
    <TransactionFlow(TransactionFlowOption.Mandatory)>
    Sub AddNewOrder(itemHeader As Order,
                    itemDetails As List(Of Order_Detail))

End Interface

<DataContract()>
Public Class NorthwindServiceFault

    <DataMember()>
    Public Property ErrorMessage As String

    <DataMember()>
    Public Property ErrorDate As String

End Class

5. Buat service implementasi sebagai berikut :

   1:  Imports System.Collections.Generic
   2:  Imports System.Data.Linq
   3:  Imports System.Security.Permissions
   4:   
   5:  Public Class NorthwindServices
   6:      Implements INorthwind
   7:   
   8:      Public Sub New()
   9:      End Sub
  10:   
  11:      <PrincipalPermission(SecurityAction.Demand, Role:="Administrators")>
  12:      <OperationBehavior(TransactionScopeRequired:=True)>
  13:      Public Sub AddNewOrder(itemHeader As Order,
  14:                             itemDetails As List(Of Order_Detail)) _
  15:                              Implements INorthwind.AddNewOrder
  16:   
  17:          Using db As New NorthwindDataContext
  18:              Try
  19:   
  20:                  itemHeader.Order_Details.AddRange(itemDetails)
  21:                  db.Orders.InsertOnSubmit(itemHeader)
  22:                  db.SubmitChanges()
  23:   
  24:              Catch ex As Exception
  25:                  Throw New FaultException(Of NorthwindServiceFault)(
  26:                      New NorthwindServiceFault With {
  27:                          .ErrorDate = Now.ToString,
  28:                          .ErrorMessage = ex.Message})
  29:              End Try
  30:          End Using
  31:      End Sub
  32:   
  33:  End Class

Perhatikan baris ke 11. Teknik code access security (CAS) di .NET dapat di implementasikan secara declarative atau imperative, baris diatas dilakukan secara declarative dimana prosedur hanya dapat diakses oleh role Administrators.

6. Buka web.config file dengan menggunakan WCF Service Configuration Editor Tools.

7. Buat sebuah wsHttpBinding configuration baru.

8. Ubah properti-properti berikut ini di security tab wsHttpBinding configuration yang telah dibuat sebelumnya.

Mode security Message digunakan untuk melakukan proteksi di sisi Message layer dimana tipe credentialnya menggunakan UserName yang sudah dibuatkan di database aspnetdb pada saat membuat user dan role di WAT. Sedangkan untuk transport client credential type nya menggunakan None karena untuk skenario kali ini kita tidak menggunakan SSL untuk transport layer securitinya.

9. Tambahkan Service Behaviour Configuration baru untuk serviceAuthorization dan serviceCredentials di bawah folder Advanced – Service Behaviours.

10. Ubah properti-properti berikut ini di node serviceAuthorization.

Setting tersebut dilakukan untuk mengimplementasikan teknik autorisasi yang telah disediakan fiturnya oleh asp.net role provider.

11. Ubah properti-properti berikut ini di node serviceCredentials.

Setting tersebut dilakukan untuk mengimplementasikan teknik autentikasi yang telah disediakan fiturnya oleh asp.net membership provider.

12. Ubah properti-properti berikut ini di node serviceCertificate di bawah node serviceCredentials.

Meskipun tidak menggunakan SSL di sisi transport namun penggunaan certificate tersebut tetap dibutuhkan. Anda dapat membuat certificate lokal hanya untuk kebutuhan development saja. Certificate tersebut dapat dibuat langsung dari IIS atau menggunakan tools makecert.exe yang dijalankan lewat Visual Studio Command Prompt.

13. Ubah default protocol mapping http dari basicHttpBinding menjadi wsHttpBinding atau ws2007HttpBinding. Hal tersebut diperlukan untuk melakukan Message security level yang tidak dapat dilakukan oleh basicHttpBinding karena binding tersebut tidak mengimplementasikan WS-Security standard.

14. Build WCF Service Application tersebut dan browse file .svc nya. Pastikan tidak ada error.

Langkah selanjutnya yaitu membuat aplikasi yang dapat mengkonsumsi service yang sudah dibuat diatas. Kali ini kita akan membuat asp.net web site sebagai aplikasi clientnya.

15. Tambahkan Asp.Net Empty Web Site project ke dalam solution yang sama dan beri nama NorthwindWeb.

16. Lakukan Add Service Reference ke WCF Service diatas dan beri nama NorthwindServiceReference sebagai reference namenya.

17. Tambahkan web form kedalam project tersebut dan berikan nama Orders.aspx. Anda dapat berkreasi sendiri untuk membuat designnya dimana intinya web form tersebut digunakan untuk melakukan insert data ke table Orders dan Order Details sekaligus.

18. Tambahkan referensi ke System.Transactions.dll dan lakukan imports namespace berikut ini :

Imports System.ServiceModel
Imports System.Transactions
Imports NorthwindWeb.NorthwindServiceReference

19. Asumsikan terdapat sebuah button untuk melakukan insert data di web form tersebut. Ketikkan kode berikut ini di event click button tersebut :

   1:      Protected Sub btnSaveOrders_Click(sender As Object,
   2:                                        e As EventArgs) Handles btnSaveOrders.Click
   3:   
   4:          If ViewState("orders") IsNot Nothing Then
   5:   
   6:              Dim itemHeader As New Order With {
   7:                  .CustomerID = ddlCustomer.SelectedValue,
   8:                  .EmployeeID = Convert.ToInt32(ddlEmployee.SelectedValue),
   9:                  .OrderDate = Convert.ToDateTime(Now.ToShortDateString)}
  10:   
  11:              Dim itemDetails = CType(ViewState("orders"), List(Of Order_Detail))
  12:   
  13:              Dim svc As New NorthwindClient
  14:   
  15:              Using ts As New TransactionScope
  16:                  Try
  17:                      svc.ClientCredentials.UserName.UserName = "admin1"
  18:                      svc.ClientCredentials.UserName.Password = "admin123."
  19:   
  20:                      svc.AddNewOrder(itemHeader, itemDetails)
  21:                      ts.Complete()
  22:   
  23:                      ViewState("orders") = Nothing
  24:                      lblInfo.Text = "Orders Saved."
  25:                  Catch ex As Security.SecurityAccessDeniedException
  26:                      lblInfo.Text = ex.Message
  27:                  Catch ex As Security.MessageSecurityException
  28:                      lblInfo.Text = ex.InnerException.Message
  29:                  Catch ex As FaultException(Of NorthwindServiceFault)
  30:                      lblInfo.Text = ex.Detail.ErrorDate & " : " &
  31:                          ex.Detail.ErrorMessage
  32:                  Finally
  33:                      If svc IsNot Nothing Then svc = Nothing
  34:                  End Try
  35:              End Using
  36:   
  37:          End If
  38:      End Sub

Perhatikan kode di baris ke 17 dan 18. Kode tersebut digunakan untuk supply service credentials dari user yang akan melakukan eksekusi kode tersebut. Tentunya anda dapat membuat form yang lebih interaktif untuk menerima input user name dan password secara dinamis.

20. Apabila di browse halaman tersebut dan melakukan sebuah transaksi maka akan dilihat hasil sbb :

21. Ubah password yang ada di baris ke 18 dengan input yang salah, maka hasilnya akan dapat dilihat sbb :

Tentunya data Orders tersebut tidak masuk ke dalam database.

22. Ubah user name menjadi user1 dengan password yang telah diisikan pada saat create user, hasilnya sbb :

23. Hapus kode di baris-11 yang terdapat di langkah-5 dan lakukan modifikasi sbb :

   1:      <OperationBehavior(TransactionScopeRequired:=True)>
   2:      Public Sub AddNewOrder(itemHeader As Order,
   3:                             itemDetails As List(Of Order_Detail)) _
   4:                              Implements INorthwind.AddNewOrder
   5:   
   6:          Dim prinPerm As New PrincipalPermission(Nothing, "Administrators")
   7:   
   8:          Using db As New NorthwindDataContext
   9:              Try
  10:                  prinPerm.Demand()
  11:   
  12:                  itemHeader.Order_Details.AddRange(itemDetails)
  13:                  db.Orders.InsertOnSubmit(itemHeader)
  14:                  db.SubmitChanges()
  15:   
  16:              Catch ex As Exception
  17:                  Throw New FaultException(Of NorthwindServiceFault)(
  18:                      New NorthwindServiceFault With {
  19:                          .ErrorDate = Now.ToString,
  20:                          .ErrorMessage = ex.Message})
  21:              End Try
  22:          End Using
  23:      End Sub

Perhatikan kode pada baris-6 dan 10. Kali ini kita menggunakan teknik imperative security. Dengan teknik imperative kita dapat melakukan proteksi pada kode yang lebih spesifik lagi dan bukan secara prosedur level.

24. Build WCF Project.

25. Lakukan Update Service Reference di Asp.Net web site.

26. Lakukan input order baru dengan menggunakan user name user1 dengan password yang benar, hasilnya dapat dilihat sbb :

27. Hapus kode di baris-6 dan 10 pada langkah 23 dan lakukan modifikasi sbb :

   1:      <OperationBehavior(TransactionScopeRequired:=True)>
   2:      Public Sub AddNewOrder(itemHeader As Order,
   3:                             itemDetails As List(Of Order_Detail)) _
   4:                              Implements INorthwind.AddNewOrder
   5:   
   6:          Using db As New NorthwindDataContext
   7:              Try
   8:   
   9:                  If System.Web.Security.Roles.IsUserInRole(
  10:                      "Administrators") Then
  11:   
  12:                      itemHeader.Order_Details.AddRange(itemDetails)
  13:                      db.Orders.InsertOnSubmit(itemHeader)
  14:                      db.SubmitChanges()
  15:                  Else
  16:                      Throw New FaultException(Of NorthwindServiceFault)(
  17:                          New NorthwindServiceFault With {
  18:                          .ErrorDate = Now.ToString,
  19:                          .ErrorMessage = ""}, "You're not authorized.")
  20:                  End If
  21:   
  22:              Catch ex As Exception
  23:                  Throw New FaultException(Of NorthwindServiceFault)(
  24:                      New NorthwindServiceFault With {
  25:                          .ErrorDate = Now.ToString,
  26:                          .ErrorMessage = ex.Message})
  27:              End Try
  28:          End Using
  29:      End Sub

Untuk pengecekan autorisasi anda dapat melakukan alternatif dengan teknik yang dapat dilihat di baris-9.

28. Lakukan langkah 24-25 dan 26. Hasilnya dapat dilihat pada gambar berikut ini :

Dari penjelasan di atas dapat kita simpulkan bahwa untuk melakukan proteksi WCF service di internet kita dapat memanfaatkan asp.net role membership provider. Sedangkan dari sisi proteksi prosedur atau kode anda diberikan pilihan untuk menggunakan CAS secara declarative maupun imperative. Selamat mencoba.


[Comments]

[Write your comment]
Name (required)
Email (required-will not published)
 
Comment

pfog
Input code above below (Case Sensitive) :
About Me 
Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Microsoft Certified Trainer | IT Trainer at Native Enterprise | IT Consultant | Software Developer | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.
[Read More...]
Top Download 
Mapping Hak Akses User Pada MenuStrip Sampai Control Button : Downloaded 6083 times  
Bagaimana caranya menginstal database ketika deploying sebuah aplikasi? : Downloaded 4689 times  
Simple Voice Engine Application With Sound Player Class... : Downloaded 3554 times  
Change Group,Sort Order, Filtering By Date in Crystal Reports : Downloaded 3324 times  
WinForms DataGrid Paging With SqlDataAdapter : Downloaded 2706 times  
Links 
Certifications 
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench
Native Enterprise 
Follow Me 
Facebook   LinkedIn   Twitter
Syndication 
Hosted By 
Native Enterprise News 
© Copyright 2006-2016   Rully Yulian MF   All rights reserved.