Silverlight 4 + RIA Services – Ready for Business: Xác thực người dùng và cá nhân hóa


Trong các ứng dụng doanh nghiệp, thông thường dữ liệu rất có giá trị và do vậy việc kiểm soát được người truy cập cũng như quyền của họ là vô cùng quan trọng. May mắn là điều này cũng rất dễ dàng với RIA Services. Ví dụ, cho là chúng ta chỉ muốn những người đã đăng nhập mới có quyền truy cập dữ liệu, điều này có thể thực hiện dễ dàng bằng cách thêm vào một thuộc tính, giống như dòng 2 trong ví dụ dưới:

  1:     [EnableClientAccess]
  2:     [RequiresAuthentication]
  3:     public class DishViewDomainService : LinqToEntitiesDomainService<DishViewEntities>
  4:     {
  5:

Khi chạy ứng dụng, giờ bạn sẽ nhận được một thông báo lỗi. Rõ ràng bạn có thể làm tốt hơn một chút từ góc độ người dùng… nhưng nói chung thì thông báo này cũng tương đối đầy đủ.

image_thumb[93]

Nhớ là có một tùy chọn để đăng nhập, vậy nên chúng ta sẽ đăng nhập vào hệ thống…

image_thumb[107]

và thậm chí đăng ký một tài khoản mới.

image_thumb[108]

và khi nạp lại, chúng ta sẽ lấy được dữ liệu:

image_thumb[97]

Giờ thì ứng dụng đã biết tôi là ai và cung cấp một tùy chọn để tôi đăng xuất.

Bạn cũng có thể tương tác với người dùng đang đăng nhập hiện tại, ví dụ, chỉ trả về các bản ghi mà họ đã chỉnh sửa, hoặc như trong trường hợp này, ghi lại tất cả các thao tác truy cập của họ.

  1:         public IQueryable<Restaurant> GetRestaurants()
  2:         {
  3:             File.AppendAllLines(@"C:\Users\brada\Desktop\log.txt", new string[] {
  4:                 String.Format("{0}:{1}", DateTime.Now,
  5:                 this.ServiceContext.User.Identity.Name)});
  6:             return this.ObjectContext.Restaurants
  7:                 .Where (r=>r.Region != "NC")
  8:                 .OrderBy(r=>r.ID);
  9:         }
 10:

Dòng 5 chính là chìa khóa giúp chúng ta biết được người dùng hiện tại trên server, và nhờ đó ta có thể có các dòng log sau:

3/7/2010 9:42:57 PM:darb
3/7/2010 9:43:05 PM:darb

Giờ bạn cũng có thể cá nhân hóa lại một chút, cho là chúng ta muốn người dùng có thể đưa ra một màu ưa thích, ta có thể lưu lại trên cả client và server, và do vậy người dùng có thể dùng mà không phụ thuộc vào máy tính họ đang ngồi.

Đầu tiên ta sẽ phải thêm BackgroundColor và bộ lưu trữ, trong trường hợp này tôi dùng bộ lưu trữ ASP.NET profile, tôi sẽ thêm một vài dòng cân thiết vào file web.config.

image_thumb[103]

Sau đó tôi cần truy cập vào nó từ chương trình Silverlight, do vậy tôi thêm một thuộc tính vào lớp User trong Models\User.cs.

    public partial class User : UserBase
    {
        public string FriendlyName { get; set; }
        public string BackgroundColor { get; set; }
    }

Cuối cùng, tôi muốn truy cập vào từ client, trong file Main.xaml tôi thêm các dòng 2 và 3:

  1:   <Grid x:Name="LayoutRoot" Style="{StaticResource LayoutRootGridStyle}"
  2:         Background="{Binding Path=User.BackgroundColor}"
  3:         DataContext="{StaticResource WebContext}">
  4:
  5:

Chạy và bạn sẽ có màu mặc nhiên:

image_thumb[104]

Giờ đã hoạt động rồi, nhưng vẫn có thể làm cho nó tốt hơn nếu cho phép người dùng tự thay đổi màu của chính họ. Do vậy trong About.xaml, tôi sẽ làm cùng một mô hình như trên.

  <Grid x:Name="LayoutRoot"
        DataContext="{StaticResource WebContext}">

<sdk:Label Content="Background Color:" />
<TextBox Text="{Binding Path=User.BackgroundColor, Mode=TwoWay}" Height="23" />

Sau đó gắn sự kiện Click của nút Save vào phương thức sau:

        private void button1_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            WebContext.Current.Authentication.SaveUser(false);
        }

Và nó làm việc!

image_thumb[105]

Và tuyệt vời nhất là nếu bạn chạy nó từ một cửa sổ trình duyệt khác, hay thậm chí là trên một máy tính khác, bạn cũng sẽ lại màu đã chọn sau khi đăng nhập!

image_thumb[106]

6 thoughts on “Silverlight 4 + RIA Services – Ready for Business: Xác thực người dùng và cá nhân hóa

  1. Anh cho em hỏi cách Load hình từ Linq lên datagirdview a. Mình phải khai báo biến nó kiểu sao và lấy đường dẩn kiểu sao ạ.? Tài liệu về Linq trong trang web của anh chiếm hêt trên Google rồi.Nhưng em vẩn chưa thấy về phần đó. Cảm ơn vì nguồn tài liệu của anh. Nhưng anh có thể cho đoạn code về load hình. Thank lần nửa hihi.

  2. Em có thể dùng varbinary(max) để lưu dữ liệu, khi đó trong LINQ nó sẽ được map thành kiểu Binary. Em có thể ảnh chứa trong đó ra bằng cách chuyển nó về mảng byte và convert thành Image:

    giả sử em có table Product được map vào lớp có tên tương ứng trong DataContext, trong đó có cột ProductImage chứa hình ảnh có kiểu varbinary(max), em muốn hiển thị ảnh trong đó lên một picture box tên pbImage thì có thể viết như sau:

    Product product = …
    byte[] b = product.ProductImage.ToArray();
    pbImage.Image = Image.FromStream(new System.IO.MemoryStream(b.ToArray()));

    Lần sau nhớ post comment đúng chỗ nhé em

  3. Mình có một câu hỏi như sau:
    giả sử bây giờ mình public 1 service ra bên ngoài với 1 số endpoint (JSON,SOAP..). vậy thì làm sao mình có thể xác thực được người dùng bên ngoài muốn sử dụng các dịch vụ của mình ?

  4. Xin chào anh ! Phần xác thực người dùng trong WCF RIA em còn rất mơ hồ, em đã đọc một số bài viết, nhưng cũng không rõ cho lắm như:
    1.Khi mình thêm 1 Authencation Domain services, thì trong đó mình phải khai báo những gì.
    2.Mình phân quyền cho những Roles trong đó như thế nào ?
    3.Khi kết nối nó với csdl (ví dụ em có 1 bảng user(Mauser,Tendn,Matkhau)) thì em làm như thế nào ?
    Nếu có thể anh cho em một ví dụ nhỏ về cái này được không ?
    Cám ơn anh nhiều!

  5. Lâu ngày post câu hỏi mà không ai replay hết, ===> tự mày mò, tìm hiểu, kiếm tài liệu rồi củng ra, hihi.
    Nếu bạn nào cũng có thắc mắc giống mình , thì mail cho mình nhen, hihi.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s