Reyza

tenang, senang, sederhana
See also: Other Geeks@INDC

Public

January 2011 - Posts

ASP.NET : Fake Windows Authentication

image

Patrick Jane : Hallo, Ada apa John? Deploymentnya sukses & lancar?

Red John : Ada beberapa issue nih mas bos, ternyata mereka ingin menggunakan smart card untuk login komputer dan ingin setelah login komputer otomatis juga login ke aplikasi yang kita buat. Padahal kita sekarang kita cuma melakukan authentication dengan menggunakan form login.

Patrick Jane : Bukannya gampang tuh untuk menyelesaikan masalah tersebut. Tujuh menit juga sudah kelar.

{Real Windows Authentication}

Pada ASP.NET sangat mudah untuk mengubah proses authentication dari Form (menggunakan form login) ke bentuk Windows (menggunakan windows logon), yaitu cukup mengedit file web.config dan mengganti kode berikut :

<authentication mode="Forms">

Menjadi seperti berikut :

<authentication mode="Windows">

Dan dalam sekejap, windows logon menjadi proses authentication pada aplikasi web. Tetapi bagaimana kalau aplikasi web terdahulu tersebut telah menggunakan Role Manager untuk mengelola role dari user, dimana role tersebut terkait dengan Sitemap yang digunakan untuk membuatan menu. Seperti yang telah kita ketahui, Sitemap adalah “sumber data” yang menampilkan menu dengan menggunakan kontrol Menu ataupun TreeView. Item-item menu yang akan ditampilkan akan sesuai dengan role yang dimiliki oleh user yang telah login. Aplikasi lama tersebut juga memanfaatkan Profile untuk mengelola data tambahan untuk user. Apakah ketika mode authentication diganti menjadi “Windows” akan berdampak pada Role dan Profile yang telah digunakan?

Misalkan nama user yang disimpan pada sistem sebelumnya adalah NAMAUSER, sedangkan bila menggunakan authentication mode Windows maka nama user login yang ditangkap adalah [NAMADOMAIN]\NAMAUSER. Walaupun proses authentication berhasil dilewati, tetapi karena perbedaan nama user login tersebut membuat user yang telah login tidak mendapatkan Role dan Profile. Otomatis user tersebut menjadi kehilangan item-item menu yang sesuai dengan rolenya atau data profile tambahan.

{Fake Windows Authentication}

Agar data user, role dan profile masih bisa digunakan tanpa harus melakukan perubahan yang berarti kode-kode yang ada pada aplikasi web yang telah ada. Logikanya adalah sesuai dengan langkah-langkah berikut ini :

  • Mendapatkan user logon window.
  • Mencocokan nilai user logon tersebut dengan data Membership pada aplikasi lama.
  • Bila cocok maka secara otomastis user akan “diloginkan” tanpa harus memasukkan username dan password pada form login.

Dengan cara ini mode authentication yang digunakan adalah Form.

<authentication mode="Forms">

Untuk mendapatkan user login windows dapat menggunakan kode berikut :

string logonUser = Request.ServerVariables["LOGON_USER"];

Dengan kode di atas, maka nilai pada logonUser akan seperti berikut [NAMA_DOMAIN]\nama_user. Artinya kita cukup mengambil nama_user yang dapat dilakukan dengan cara berikut :

if (!String.IsNullOrEmpty(logonUser))
{
    string[] logonUserArr = logonUser.Split('\\');
    username = logonUserArr[logonUserArr.Length - 1];
    . . .
}

Sekarang kita sudah punya nilai “nama_user” yang ditampung di dalam variable username.  Selanjutnya tinggal memeriksa keberadaan username tersebut ke data Membership dengan cara berikut “kasar” seperti berikut ini :

   1: MembershipUser userObj = Membership.GetUser(username);
   2:  
   3: if (userObj != null)
   4: {
   5:     FormsAuthentication.RedirectFromLoginPage(username, true);
   6: }
   7: else
   8: {
   9:     Response.Redirect("~/Public/MessagePage.aspx");
  10: }

Pada baris pertama dapat dilihat cara untuk mengambil data user sesuai nilai username yang telah didapat, kemudian jika user tersebut ditemukan pada data Membership maka secara otomatis kita bisa “me-login-kan” user tersebut dengan cara seperti pada baris ke-5.

Dan Semi/Fake Windows Authentication pun dapat digunakan seperti layaknya Real WIndows Authentication.

#selamat-menikmati-akhir-pekan

Share this post: | | | |
Posted: Jan 21 2011, 11:05 PM by reyza | with 2 comment(s)
Filed under:
Dynamic Data : Create Simple CRUD Page in Seconds

Dynamic Data untuk membuat form CRUD untuk banyak tabel  dalam sekejap bukan barang baru lagi, tapi apakah benar Dynamic Data bisa memberikan apa yang diinginkan baik itu dari sisi kesesuaian antarmuka dan hal-hal lainnya ?

Sebelum pertanyaan itu terjawab ada baiknya memperlihatkan secara singkat bagaimana Dynamic Data membantu mempercepat pekerjaan developer untuk membuat halaman sederhana dengan fungsi CRUD (Create Retrieve Update Delete).

image

Pada gambar di atas digunakan Web Application Template untuk membuat “Aplikasi yang memanfaatkan Dynamic Data”, walau tidak menutup kemungkinan untuk menggunakan “Web Site Template”. Untuk “sumber data” dapat digunakan Linq to SQL dan Entity Framework, seperti yang terlihat pada gambar di atas. Pada contoh ini akan digunakan Linq to SQL.

Selanjutnya menambahkan “sumber data” dengan membuat LINQ to SQL Classes, dengan nama Northwind.dbml.

image

Selanjutnya tinggal membuat koneksi ke database via Server Explorer yang ada di Visual Studio, dan “tarik” tabel-tabel yang diinginkan ke Northwind.dbml.

image

Langkah terakhir adalah memodifikasi file Global.asax.cs untuk menentukan “sumber data” yang digunakan, dengan cara “meng-uncomment” baris berikut :

 
DefaultModel.RegisterContext(typeof(YourDataContextType), new ContextConfiguration() { ScaffoldAllTables = false });
 

Kemudian mengubah nilai “YourDataContextType” dengan nama data context yang sesuai dengan yang telah didefinisikan pada Northwind.dbml, yaitu NorthwindDataContext, dan mengubah nilai ScaffoldAllTables menjadi True, artinya nanti kita akan mempunyai halaman CRUD untuk semua “tabel” yang sudah didaftarkan pada Northwind.dbml.

 
DefaultModel.RegisterContext(typeof(NorthwindDataContext), new ContextConfiguration() { ScaffoldAllTables = true });
 

Build, dan View in Browser, hasilnya bisa dilihat seperti gambar di bawah ini :

image

image

image

Secara “otomatis” kita sudah punya halaman untuk melihat data dalam bentuk Grid dan form untuk insert/update data sesuai dengan struktur tabel yang ada. Form lumayan pintar melakukan penyesuaian, misalnya tabel mempunyai relasi maka “ada kemungkinan” input-an akan berbentuk dropdownlist. Apabila field memiliki sifat “not null” maka secara otomatis memberikan validasi dengan control RequiredFieldValidator dan banyak lain hal-hal lain yang “dibuatkan secara otomatis”.

Apakah “Default” yang dibuat oleh Dynamic Data sudah cukup? Bagaimana apabila ada keinginan seperti berikut ini :

  • Saya sudah membuat web app dengan menggunakan template Web Site, dan sudah banyak halaman yang telah dibuat, tetapi setelah mendapatkan informasi tentang Dynamic Data, ada keinginan menggunakannya untuk mengelola data master yang memang fungsionalitasnya cuma CRUD, apakah mungkin Dynamic Data digabungkan dengan web app yang sudah ada?
  • Karena saya sudah punya web app, saya ingin antarmuka halaman yang menggunakan Dynamic Data mempunyai tampilan yang senada. Begitu juga dengan keragaman URL untuk mengakses halaman. Apakah bisa?
  • Saya menggunakan LINQ to SQL, yang didalamnya sudah didaftarkan seluruh tabel untuk keperluan aplikasi, saya ingin menggunakan Dynamic Data tapi hanya ingin “tabel-tabel” tertentu saja yang akan dikelola dengan Dynamic Data, apakah hal itu mungkin?

Baiklah kita coba temukan jawabannya satu per satu.

{Dynamic Data Web Site + Existing My Web App}

Sebelumnya kita perhatikan dahulu item-item apa saja yang terdapat pada template ASP.NET Dynamic Data Linq to SQL Web Site.

image

Terdapat beberapa hal penting dari Solution Explorer yang dilihat digambar, yaitu folder DynamicData, Global.asax dan web.config. Maka langkah pertama untuk menambahkan “kemampuan Dynamic Data” pada website yang kita miliki maka copy folder Dynamic Data beserta isinya ke web app yang sudah ada. Kemudian copy juga file Global.asax ke root folder dari web app.

Maka kira-kira akan terlihat seperti gambar berikut :

image

Selanjutnya menyesuaikan isi web.config pada Existing My Web App agar mempunyai “kemampuan Dynamic Data” dengan menambahkan hal-hal berikut ini :

<compilation debug="true">
    <assemblies>
        . . .
        <!-- Dynamic Data-Start -->
        <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.ComponentModel.DataAnnotations, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <!-- Dynamic Data-End -->
        . . .
    </assemblies>
</compilation>

Kemudian…

<pages theme="Ehem">
    <controls>
        . . .
        <!-- Dynamic Data-Start -->
        <add tagPrefix="asp" namespace="System.Web.DynamicData" assembly="System.Web.DynamicData, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add tagPrefix="rsweb" namespace="Microsoft.Reporting.WebForms" assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
        <!-- Dynamic Data-End -->
    </controls>
</pages>

Kemudian…

<httpModules>
   . . .
   <!-- Dynamic Data-Start -->
   <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
   <!-- Dynamic Data-End -->
</httpModules>

Kemudian …

<system.webServer>
    . . .
    <modules>
        . . .
        <!-- Dynamic Data-Start -->
        <remove name="UrlRoutingModule"/>
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <!-- Dynamic Data-End -->
    </modules>
    . . .
</system.webServer>

Sekarang modifikasi web.config sudah selesai, dan dilanjutkan dengan penyesuaian pada file Global.asax untuk menentukan Class DataContext seperti yang telah dijelaskan di atas.

Selain itu juga dapat dilakukan penyesuaian URL akses dengan cara seperti berikut :

   1: routes.Add(new DynamicDataRoute("Setup/{table}.aspx")
   2: {
   3:     Action = PageAction.List,
   4:     ViewName = "ListDetails",
   5:     Model = model
   6: });

Pada baris ke-1 adalah cara untuk menentukan cara akses halaman CRUD untuk tabel yang diinginkan, misalnya ingin mengakses halaman CRUD untuk tabel Pegawai, maka kita dapat menuliskannya seperti berikut http://domain/Setup/Pegawai.aspx. Bila nama tabelnya adalah Hasil_Penjualan, maka kita dapat mengaksesnya dengan mengakses URL http://domain/Setup/Hasil_Penjualan.aspx. Pada kode di atas dapat juga untuk menentukan Page Template yang ingin digunakan. Pada contoh di atas akan digunakan ListDetails.aspx sebagai Page Template.

Page Template ini dapat kita temukan di folder DynamicData\PageTemplates, seperti pada gambar.

image

Pada file ListDetail.aspx, dapat kita tentukan MasterPage yang digunakan oleh “Existing My Web App” sehingga antarmuka halaman Dynamic Data akan sesuai dengan halaman-halaman yang sudah ada. Dan berikut antarmuka dari halaman DynamicData yang telah dipermak baik dari penggunaan MasterPage dan juga CSS.

image

image

Sangat gampang!

{Menentukan Tabel yang ingin dikelola dengan halaman Dynamic Data}

Bila dalam LINQ to SQL Classes terdapat banyak “class yang menjadi representasi tabel pada database”, tetapi tidak semua yang akan dikelola dengan halaman Dynamic Data, maka kita bisa menentukan “tabel” mana saja yang ingin dikelola dengan cara berikut ini.

Langkah pertama membuat nilai atribut ScaffoldAllTables pada file Global.asax bernilai false.

   1:  
   2: DefaultModel.RegisterContext(typeof(NorthwindDataContext), new ContextConfiguration() { ScaffoldAllTables = false });
   3:  

Dari kode di atas maka tidak semua tabel yang dikelola oleh halaman Dynamic Data, kita harus menentukan sendiri tabel mana saja yang ingin dikelola. Misalnya kita ingin mengelola tabel Category dan Territory saja maka yang pertama kita lakukan adalah membuat file class dengan isi seperti berikut ini.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5:  
   6: using System.ComponentModel.DataAnnotations;
   7:  
   8: namespace WebApplication1
   9: {
  10:     [ScaffoldTable(true)]
  11:     public partial class Category { }
  12:  
  13:     [ScaffoldTable(true)]
  14:     public partial class Territory { }
  15: }

Dari kode di atas baris 10 dan baris 13 dapat dilihat bagaimana menentukan agar “tabel” Category dan Territory “didaftarkan” agar agar bisa dikelola dengan menambahkan atribut [ScaffoldTable(true)], dan jangan lupa untuk menggunakan NameSpace System.ComponentModel.DataAnnotations, agar kedua baris tersebut tidak “digarisbawahi”.

Selamat mencoba bagi yang memerlukan, semoga berguna.

Share this post: | | | |
ASP.NET : Create you own “CommandName”

Daripada menjawab pertanyaan satu arah via email, akan lebih baik pertanyaannya dijawab via tulisan di Blog agar bila ada pertanyaan yang sama cukup “copy-paste” URL saja, tanpa perlu analisis :)

Bagi pengemar ebook yang saya buat pasti tidak asing dengan gaya penyampilan data dengan menggunakan GridView dan aksi seperti pada gambar di bawah ini.

image

Pada gambar di atas terdapat LinkButton dengan title Detail yang ketika dipilih akan memanggil CommandName=”Select” yang secara default pasti akan mengeksekusi method yang “dipilih” pada “atribut” OnSelectedIndexChanged.

image

image

Setelah itu tinggal terserah anda mau melakukan hal-hal apa saja didalam method tersebut.

   1: protected void GridView_Main_SelectedIndexChanged(object sender, EventArgs e)
   2: {
   3:     // silakan tulis yang ingin dilakukan disini
   4: }

Jadi dapat disimpulkan apabila link “Detail” diklik maka secara otomatis method di atas ini akan dieksekusi.

Selanjutnya untuk menghapus data dilakukan dengan cara memilih checkboxlist record-record yang akan dihapus kemudian diakhiri menekan tombol Delete untuk menghapus. (caranya? silakan unduh ebooknya di sini).

Bagaimana kalau ingin melakukan kedua hal tersebut dengan cara berbeda, misalnya seperti ini :

image

Pada record terdapat tombol untuk “menghapus record yang dipilih” (icon merah) dan “melihat nilai lengkap record yang dipilih” (icon edit). Untuk icon edit adalah ImageButton yang menggunakan CommandName=Select seperti contoh sebelumnya.

 
<asp:ImageButton ID="ImageButton2" ImageUrl="~/App_Themes/Ehem/icons/icon_edit.png" AlternateText="Select" CommandName="Select" runat="server" />
 

Sedangkan ‘icon delete’ dapat menggunakan CommandName=Erase dan melemparkan key dari record yang ingin di hapus.

 
<asp:ImageButton ID="ImageButton1" ImageUrl="~/App_Themes/Ehem/icons/icon_close.gif" OnClientClick="return confirm('Are you sure you want to delete?');" Width="16px" Height="16px" AlternateText="Delete" CommandName="Erase" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ADDRESS_ID") %>' runat="server" />
 

Pada code di atas dapat dilihat cara untuk melempar key dari record yang ingin dihapus dengan menggunakan CommanArgument.

Pertanyaannya adalah, Apakah Command “Erase” itu ada? Jawabnya tidak ada, Anda dan harus dibuatnya! Caranya gampang, tinggal gunakan OnRowCommand pada GridView.

image

Kemudian pada event handler GridView_Detail_RowCommand, dapat dibuat seperti berikut :

protected void GridView_Detail_RowCommand(Object sender, GridViewCommandEventArgs e)
{
    if (e.CommandName == "Erase")
    {
        // contoh mengambil key yang dilempar dengan CommandArgument
        decimal childId = Convert.ToDecimal(e.CommandArgument);
    }
}

Selanjutnya terserah Anda.

#semogaMembantu

Share this post: | | | |
Posted: Jan 17 2011, 09:15 PM by reyza | with 1 comment(s)
Filed under:
WP7 Challenge : “Photos of The Day”

Seperti yang dapat ditemui disini http://msdn.microsoft.com/id-id/gg128656, maka ada tantangan di awal tahun 2011 dari Windows Phone 7 (begitu juga tantangan dari forum-forum sebelah *eh) :)

image

Photo of The Day? Apakah itu? Informasi ini mungkin tidak penting buat penghuni portal ini, tapi bagi saya informasi ini lumayan penting yang karena setiap jam 12 malam beberapa situs melakukan perhitungan dan menampilkan foto terbaik hari ini. Membuka situs jam 12 malam atau membuka situs tersebut setelah bangun tidur? Sepertinya akan lebih baik bila ada 1 apps yang bisa memberikan informasi “photos of the day” dari beberapa situs sekaligus yang bisa dilihat sambil tiduran dalam dan dalam genggaman pula :)

Tapi kan informasi itu tidak menarik untuk penghuni portal ini? ah biar lah…seperti tujuan gw nge-blog di portal ini untuk catatan biar tidak lupa dan gampang dilihat dimana saja bila diperlukan. Begitu juga apps ini, dibuat untuk tujuan pribadi, sukur-sukur bisa digunakan juga bagi penghuni situs fotografer tersebut, seperti :

  • fotografer.net,  yang penghuninya terhitung cuma terbesar se-Asia Tenggara.
  • inifotoku.com, yang lagi naik daun karena fitur-fitur yang lucu (harus dipromosikan nih, karena dibuat temen).
  • ayofoto.com, yang banyak digunakan untuk mempertemukan yang punya foto dengan pembeli foto (denger-denger).
  • tidak ketinggalan jakartafotoclub.com, situs lain yang sering gw kunjungi.

Untuk situs luar negeri yang sering memberikan inspirasi foto adalah Boston Big Picture (http://www.boston.com/bigpicture/) , bagaimana dengan Flickr Explore? ah malas, sudah banyak orang yang membuat apps untuk Flickr, tinggal download dan gratis :)

{Photos of The Day}

image

(Maaf…masih ada ruang yang kosong antara menu dan “All Site”)

image  image

(Today models? .. *eh)

Ingin melihat “foto terbaik hari ini” tinggal sentuh Today Photo, untuk melihat komentar-komentar tinggal sentuh Today Comments, untuk melihat Model yang ada pada foto-foto terbaik tinggal sentuh Model … dengan prefix Today :P

Ingin melihat “foto terbaik hari ini” per situs tinggal klik situs yang diinginkan….gampang, bisa dilaukan sambil tiduran atau sambil sarapan pagi.

image

Apalagi fitur-fitur yang akan didapat? Yang pasti akan terintegrasi dengan Facebook, Twitter dan (tidak)Friendster :)

{Data}

Datanya dari mana? Karena sering ngobrol dengan Bos Movreak, maka tidak ada salahnya mencontek cara untuk mendapatkan data untuk apps ini :) Dan karena nanti datanya akan “terpusat” maka jangan kaget akan ada versi untuk iOS (secara para fotografer kebanyakan Apple Fanboy :P) dan Android.

BB? Hmm….mungkin akan dibuat dikehidupan yang lain, saat roda reinkarnasi berputar sebagai BB user :) Symbian? Hmm….nanti dipikirkan kalau ada hardwarenya :P

 

*Selamat tahun baru, 2011 untuk semua

Share this post: | | | |
1.1.11

image

Selamat Tahun Baru, semoga 2011 menjadi tahun yang lebih baik dari tahun sebelumnya. Untuk mengenang cahaya-cahaya di awal 2011 “diseluruh” dunia maka bisa segera mengunduh Firework Windows 7 Theme.

DSC_3848-resize

Bandung, 1.1.11

Share this post: | | | |