Bảo vệ chuỗi kết nối trong ASP.Net


Một đoạn code nhỏ để bảo vệ chuỗi kết nối dữ liệu

 protected void btnEncrypt_Click(object sender, EventArgs e)
    {
        EncryptSection("connectionStrings", "RsaProtectedConfigurationProvider");
    }

    protected void EncryptSection(string section, string provider)
    {
        // Lấy thông tin file web.config của một website
        Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        // Tham chiếu tới section cần mã hóa trong file web.config
        ConfigurationSection cons = config.GetSection(section);
        // Tiến hành mã hóa
        cons.SectionInformation.ProtectSection(provider);
        // Lưu lại thông tin sau khi mã hóa
        config.Save();
    }
    protected void btnDecrypt_Click(object sender, EventArgs e)
    {
        DecryptSection("connectionStrings");
    }

    protected void DecryptSection(string section)
    {
        // Lấy thông tin file web.config của một website
        Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
        // Tham chiếu tới section cần mã hóa trong file web.config
        ConfigurationSection cons = config.GetSection(section);
        cons.SectionInformation.UnprotectSection();
        config.Save();
    }

 

Advertisements

c# – cấp quyền Administrator cho ứng dụng khi chạy


Trong quá trình đóng gói ứng dụng bằng công nghệ ClickOne thì việc sử dụng trong file app.manifest là thể được do ClickOne không hỗ trợ.
Trong trương hợp này đòi hỏi phải sử dụng code gọi lệnh của window shell để cấp quyền cho process hiện tại.

đoạn code mẫu sau đây sẽ giúp chúng ta thực hiện công việc trên.

static class Program
{
    [STAThread]
    static void Main()
    {
        // Check if user is NOT admin
        if (!IsRunningAsAdministrator())
        {
            // Mở thêm chương trình hiện tại
            ProcessStartInfo processStartInfo = new ProcessStartInfo(Assembly.GetEntryAssembly().CodeBase);
            // chạy proccess với quyền Administrator chạy bằng lệnh shell của window
            // ProcessStartInfo.Verb để chạy “runas administrator”
            processStartInfo.UseShellExecute = true;
            processStartInfo.Verb = "runas";
            // Chạy process đã cấp quyền
            Process.Start(processStartInfo);
            // đóng ứng dụng cũ
            System.Windows.Forms.Application.Exit();
        }
    }

    ///
<summary>
    /// Kiểm tra tài khoản hiện tại có quyền Adnistrator khôg
    /// </summary>

    /// <returns>True nếu có quyền Administrator</returns>
    public static bool IsRunningAsAdministrator()
    {
        // Lấy tài khoản hiện tại
        WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
        // Sử dụng hệ thống tài khoản của hệ điều hành window hiện tại
        WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity);
        // Kiểm tra quyền quan trị "Administrator"
        return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
    }

Good luck.

JavaScriptSerializer: JSON serialize và deserialize trong C#


Ngày này JSON đang trở nên phổ biến bởi tính tiện lợi của nó so với XML. Với .Net thư viện JavaScriptSerializer đã được phát triển giúp cho việc chuyển đổi dữ liệu dang định dạng JSON trở nên rất đơn giản.

Chúng ta cùng tìm hiểu một chút về thư viện này qua ví dụ sau:
Mã nguồn
Định nghĩa lớp


public class Student
{
    public Student()
    {
    }
    public Student(int id, string name)
    {
        _id = id;
        _name = name;
    }

    int _id;
    string _name;
    public int ID
    {
        get
        {
            return _id;
        }

        set
        {
            _id = value;
        }
    }

    public string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;
        }
    }
}

Chuyển đối tượng sang json

Student s = new Student(100, "Nguyễn Văn Mít");
string str = serializer.Serialize(s);
Response.Write("Object: " + str);

Kết quả chạy có như sau:
Object: {“ID”:100,”Name”:”Nguyễn Văn Mít”}

Chuyển từ chuỗi JSON sang đối tượng Student

Student s1 = serializer.Deserialize<Student>(str);
Response.Write("<br/>Name: " + s1.Name);

Tương tự như vậy chúng ta cũng có thể chuyển một mảng sang JSON và ngược lại
Tạo một mảng như sau

List<Student> list = new List<Student>();
list.Add(new Student(1, "Trần Văn Cam"));
list.Add(new Student(2, "Trần Thanh Long"));
list.Add(new Student(3, "Lê Thị Lựu"));

string strlist = serializer.Serialize(list);
Response.Write("<br/>List: " + strlist);

// in
 Response.Write("<br/>List deserialize ");
 List<Student> listDe = serializer.Deserialize<List<Student>>(strlist);
 foreach (Student item in listDe)
 {
        Response.Write("<br/>Name: " + item.Name);
 }

Chạy lại ví dụ, chúng ta có kết quả
List: [{“ID”:1,”Name”:”Trần Văn Cam”},{“ID”:2,”Name”:”Trần Thanh Long”},{“ID”:3,”Name”:”Lê Thị Lựu”}]

Chuyển một DataTable sang JSON và ngược lại
Kết nối và đọc dữ liệu

SqlConnection conn = new SqlConnection("server=.;database=northwind;uid=sa;pwd=sa;");
SqlDataAdapter adp = new SqlDataAdapter("Select employeeid, firstname, lastname, birthdate, photopath from employees", conn);
DataSet ds = new DataSet();
adp.Fill(ds, "Emp");

Chuyển sang JSON

        List<Dictionary<string, object>> table = new List<Dictionary<string, object>>();
        foreach (DataRow r in ds.Tables[0].Rows)
        {
            Dictionary<string, object> column = new Dictionary<string, object>();
            foreach (DataColumn c in ds.Tables[0].Columns)
            {
                column.Add(c.ColumnName, r[c.ColumnName]);
            }
            table.Add(column);
        }

        string dsStr = serializer.Serialize(table);
        Response.Write("<br/>Data table: " + dsStr);

Chuyển từ JSON sang DataTable

        List<Dictionary<string, object>> t2 = serializer.Deserialize<List<Dictionary<string, object>>>(dsStr);
        DataTable dt = ds.Tables[0];
        dt.Clear();
        DataRow deRow;
        foreach (Dictionary<string, object> d in t2)
        {
            deRow = dt.NewRow();
            foreach (DataColumn col in dt.Columns)
            {
                deRow[col.ColumnName] = (d[col.ColumnName] == null ? DBNull.Value : d[col.ColumnName]);
            }            
            dt.Rows.Add(deRow);
        }
        GridView1.DataSource = dt;
        GridView1.DataBind();

Tới đây chạy lại ví dụ có kết quả như sau:

Data table: [{“employeeid”:1,”firstname”:”Mit”,”lastname”:”Nguyen Van”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:”http://accweb/emmployees/davolio.bmp”},{“employeeid”:2,”firstname”:”Fuller”,”lastname”:”Andrew”,”birthdate”:”\/Date(-563871600000)\/”,”photopath”:”http://accweb/emmployees/fuller.bmp”},{“employeeid”:3,”firstname”:”Janetsssss”,”lastname”:”Leverling”,”birthdate”:”\/Date(-200127600000)\/”,”photopath”:”http://accweb/emmployees/leverling.bmp”},{“employeeid”:4,”firstname”:”Margaret”,”lastname”:”Peacockdd”,”birthdate”:”\/Date(-1018854000000)\/”,”photopath”:”http://accweb/emmployees/peacock.bmp”},{“employeeid”:5,”firstname”:”Buchanan”,”lastname”:”Steven”,”birthdate”:”\/Date(-468054000000)\/”,”photopath”:”http://accweb/emmployees/buchanan.bmp”},{“employeeid”:6,”firstname”:”Suyama”,”lastname”:”Michael”,”birthdate”:”\/Date(1278003600000)\/”,”photopath”:”http://accweb/emmployees/davolio.bmp”},{“employeeid”:7,”firstname”:”Robert”,”lastname”:”King”,”birthdate”:”\/Date(-302770800000)\/”,”photopath”:”http://accweb/emmployees/davolio.bmp&#8221;},{“employeeid”:8,”firstname”:”Lauradddd”,”lastname”:”Callahan”,”birthdate”:”\/Date(-378025200000)\/”,”photopath”:”http://accweb/emmployees/davolio.bmp&#8221;},{“employeeid”:9,”firstname”:”Anne”,”lastname”:”9″,”birthdate”:”\/Date(-124009200000)\/”,”photopath”:”http://accweb/emmployees/davolio.bmp&#8221;},{“employeeid”:87,”firstname”:”Mr”,”lastname”:”Ben”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:null},{“employeeid”:89,”firstname”:”Mrdddd”,”lastname”:”dd”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:null},{“employeeid”:91,”firstname”:”Dan”,”lastname”:”Mss”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:null},{“employeeid”:102,”firstname”:”Mr”,”lastname”:”Been”,”birthdate”:”\/Date(340822800000)\/”,”photopath”:null},{“employeeid”:103,”firstname”:”Mr”,”lastname”:”Dan”,”birthdate”:”\/Date(340822800000)\/”,”photopath”:null},{“employeeid”:105,”firstname”:”Mr”,”lastname”:”Been”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:null},{“employeeid”:106,”firstname”:”Mr”,”lastname”:”Dan”,”birthdate”:”\/Date(-664786800000)\/”,”photopath”:null}]


table

Như vậy là cơ bản chúng ta có thể chuyển đổi qua lại giữa JSON và một vài kiểu của .net.

Trong PHP

Cấu hình gmail và sử dụng c# để gửi thư trong asp.net


Một trong các chức năng phổ biến hiện nay là liên lạc với người dung qua thư điện tử. Trong asp.net là công nghệ phát triển web rât mạnh nên họ cũng hỗ trợ gởi thử một cách rất đơn giản qua thư viện SmtpClient.

Trong hướng dẫn này chúng ta cùng cấu hình mail server (sử dụng mail miễn phí Gmail) trên website asp.net.

Bước 1: Cấu hình mail server qua web.config. Bổ sung mã nguồn sau và giữa thẻ configuration

<system.net>
 <mailSettings>
 <smtp from="ngotuongdan@gmail.com">
 <network host="smtp.gmail.com" password="mật khẩu" port="587"
 userName="tài khoản" />
 </smtp>
 </mailSettings>
 </system.net>
Bước 2: Sử dụng thư viện smtp để gởi thư
public Mailer(string Email, string MatKhau, string TaiKhoan)
 {
 try
 {
 var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
 string strHost = smtpSection.Network.Host;
 int port = smtpSection.Network.Port;
 string strUserName = smtpSection.Network.UserName;
 string strFromPass = smtpSection.Network.Password;
 SmtpClient smtp = new SmtpClient(strHost, port);
 NetworkCredential cert = new NetworkCredential(strUserName, strFromPass);
 smtp.Credentials = cert;
 smtp.EnableSsl = true;
 MailMessage msg = new MailMessage(smtpSection.From, Email);
 msg.Subject = "Thông tin đăng ký !";
 msg.IsBodyHtml = true;
 msg.Body += "<h1>Trung tâm quản lý người dùng.</h1>";
 msg.Body += "<h3> http://" + WebConfigurationManager.AppSettings["domain"].ToString() + "</h3>";
 msg.Body += "Bạn vừa đăng ký sử dụng hệ thống web GIS.<br/>";
 msg.Body += "<br/>Tên đăng nhập của bạn là: <b>" + TaiKhoan + "</b>";
 msg.Body += "<br/><br/>Mật khẩu của bạn là: <b>" + MatKhau + "</b><br/>";
 msg.Body += "<hr/>Bạn nên đổi mật khẩu.";
 smtp.Send(msg);
 HttpContext.Current.Response.Write("<script>alert('Gởi thư thành công.');</script>");
 }catch(Exception ex)
 {
 HttpContext.Current.Response.Write("<script>alert('Không gởi mail được');</script>");
 }
 }
Như vậy là chúng ta có thể gởi được một email tới địa chỉ của người nhận.

Responsive web design (RWD) – Thiết kế giao diện web thích ứng với kích thước màn hình thiết bị


Trước đây để có thể hiển thị nội dung website của mình trên các thiết bị di động thi giải pháp được sử dụng là tạo thêm một website phiên bản di động, như giờ thi với phương pháp thiết kế giao diện thích ứng (Responsive web design) chúng ta hoàn toàn có thể sắp xếp nội dung trên trang web của chúng ta tùy theo màn hình thiết bị mà không cần phải viết thêm một website phiên bản di động nữa.

Giao diện thích ứng với kích thước màn hình
Giao diện thích ứng với kích thước màn hình

Demo môn học PHP tại CUSC

Responsive web design (RWD) hiểu một cách đơn giản là chúng ta sẽ bố trí lại nội dung của trang web tùy theo kích thước màn hình của thiết bị (hình trên). Nói là bố trí lại vì Responsive web design (RWD) chỉ đơn thuần là ẩn/hiện hay sắp xếp trật tự của nội dung trên trang mà thôi.

Với sự hỗ trợ của CSS3 (Media Queries năm 2012) và HTML5 thì phương pháp thiết kế này trở nên rất dễ thực hiện.
Ví dụ:

@media screen and (min-width:500px) { ... }

Giúp xác định kích thước của màn hình thiết bị và ràng buộc nếu nhỏ hơn 500px thì nội dung ở giữa sẽ được thực hiện. Như vậy chúng ta chỉ việc đặt tên cho các phần tử nội dung (html element) trên trang và xử lý chúng là được.

<html xmlns="http://www.0w3.org/1999/xhtml"&gt;
<head>
<!–viewport xac dinh kich thuot dung theo man hinh–>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="icon" type="image/ico" href="images/favorite.ico">
<title>Salomon shop</title>
<link href="css.css" rel="stylesheet" type="text/css" />
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="main">
<div id="header">
<h1>SALOMON</h1>
</div>
<div id="Skin_Menu_Ngang">
<ul id="nav">
<li><a href="?home">TRANG CHỦ</a></li>
<li style="border-right: 0px"><a href="?function=dk">ĐĂNG KÝ</a></li>
</ul>
</div>
<div id="noidung">
<div id="cotPhai"> Cot phai </div>
<div id="cotTrai"> cot trai </div>
</div>
<div id="footer"> Footer </div>
</div>
</body>
</html>

Chúng ta có giao diện như sau:
salomon1

Lưu ý dòng

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">

Giúp xác định tỉ lệ scale và qui đổi điểm ảnh của màn hình thiết bị về px.
Ví dụ code css cho Demo môn học PHP tại CUSC như sau:

@media  screen and (max-width: 800px) {
#main {
	width:100%;
}

#header {
	width: 100%;	
	background-image:none;
	text-align:center;
	vertical-align:middle;
	height:70px;
}

#header h1{
	visibility:visible;
	display:inline-block;
	font-family:Arial, Helvetica, sans-serif;
	font-size:xx-large;
	color:#FFF;
} 

#trinhdon {
	width: 100%;
}
#footer {
	width: 100%;
}
#noidung {
	width: 100%;
}
#cotTrai {
	width: 100%;
}
#cotPhai {
	width: 100%;
}
}

@media screen and (max-width: 600px) {
#main {
	width: 100%;
}
#nav
{
	display:none;
}
#header {
	width: 100%;	
	background-image:none;
	text-align:center;
	vertical-align:middle;
	height:70px;
}

#header h1{
	display:inline-block;
	font-family:Arial, Helvetica, sans-serif;
	font-size:xx-large;
	color:#FFF;
} 

#trinhdon {
	width: 100%;
}
#footer {
	width: 100%;
}
#noidung {
	width: 100%;
}
#cotTrai {
	width: 100%;
}
#cotPhai {
	width: 100%;
}
}
 @media screen and (max-width:480px) {
#nav
{
	display:none;
}
#main {
	width: 100%;
}
#header {
	width: 100%;	
	background-image:none;
	text-align:center;
	vertical-align:middle;
	height:70px;
}

#header h1{
	display:inline-block;
	font-family:Arial, Helvetica, sans-serif;
	font-size:xx-large;
	color:#FFF;
} 
#trinhdon {
	width: 100%;
}
#footer {
	width: 100%;
}
#noidung {
	width: 100%;
}
#cotTrai {
	width: 100%;
}
#cotPhai {
	text-align:center;
	width: 100%;
	display:inline;
}
}

Ở đây tôi qui định nếu màn hình kích thướt lớn hơn 800px thì chúng ta có giao diện web trên máy tính với header và nội dung bố trí mặc định. Nếu lớn hơn 600px và nhỏ hơn 800px thì bố trí lại 02 phần trái phải theo chiều dọc, …

Gần đây Chrome hỗ trợ chức năng test giao diện trên các thiết bị động.
1. Nhấn F12 để vào chế độ developer
2. Chọn vào hình điện thoại ở của sổ code
3. Thay đôi kích thước màn hình bằng thướt đo hay chọn thiết bị.

Hi vọng là bài viết này có ích cho các bạn sinh viên tìm hiểu một cách căn bản nhất.

Caching Images in ASP.NET – Một bài viết rất hữu ích từ CodeProject các bạn tham khảo nhe


There are a lot of ways to improve performance in web applications. One of the simplest but most effective methods is to cache images on the client. In this article I would like to show how we implemented image caching for our website.

The Problem

When she was building the website http://www.software-architects.com she used a lot of images in the css style sheets to display background images for menu items. After transfering the files to our web server she tested how much traffic a request to our start page would produce with Microsoft Network Monitor. This is a Tool to allow capturing and protocol analysis of network traffic. You can download it from the Microsoft Download Center.

With Microsoft Network Monitor 3.1 she recorded a call to http://www.software-architects.com. As a result she got 20 requests to 20 different files to display one single page. Microsoft Network Monitor shows that appoximatly half of the requests are required for the menu images.

View detail on codeproject
http://www.codeproject.com/Articles/22888/Caching-Images-in-ASP-NET?display=Print