ASP.NET Identity 2.0: Giới thiệu về Identity 2.0 và Web API 2.2

Posted on Updated on

Link bài viết gốc: ASP.NET Identity 2.0: Introduction to Working with Identity 2.0 and Web API 2.2
Trong các bài viết vừa rồi, tôi được bao trùm bởi rất nhiều mảng sử dụng ASP.NET Identity 2.0 trong một ứng dụng MVC. Kể từ khi có RTM trong tháng 3 năm nay (2014), Identity 2.0 đã được mở rộng đáng kể cho Authentication and Authorization, công cụ có sẵn cho các ứng dụng MVC.

Tương tự, Identity 2.0 đã được mở rộng ra công cụ có sẵn Identity Manager thông qua ASP.NET Web Api. Cùng với khả năng linh hoạt và mở rộng cho dù những thứ đó làm việc khác đôi chút.

Trong bài viết này, tôi sẽ đi qua một vòng cơ bản về Identity 2.0-based Web Api application, và xem một vài ví dụ cách sử dụng đơn giản. Nếu bạn là một người có kinh nghiệm về phát triển web, có lẽ chẳng có gì mới ở đây – nó chẳng khác gì với cách giới thiệu cho level 101 (mới bắt đầu). Nếu bạn mới làm quen với Identity 2.0 và/hoặc ASP.NET Web Api thì bạn sẽ tìm được vài thông tin hữu ích đấy.

Trong một vài bài viết tiếp theo, chúng ta sẽ có một cái nhìn kỹ hơn về cách sử dụng Identity 2.0 cùng với Web Api. Chúng ta sẽ xem làm thế nào để mở rộng identity model. tương tự như chúng ta cần làm gì với Identity 2.o cho ứng dụng MVC. Chúng ta sẽ tạo một project Identity/Web Api có khả năng mở rộng dễ dàng. Chúng ta cũng sẽ khám phá các nguyên tác khác nau của Authentication and Authorization, và phát triên một sự hiểu tốt hơn về bảo mật Web Api hiểu quả. Một vài liên kết tham khảo:

Cho một sự đánh giá về những gì chúng ta làm được trên Identity 2.0 trên bôi cảnh một project ASP.NET MVC:

Và bây giờ, chúng ta sẽ có một cái nhiền high-level về basic Web Api project template có sẵn trong Visual Studio, và một cấu trúc cơ bản tương tự.

Bắt đầu – Tạo mới một project ASP.NET Web API

Trong bản VS 2013 Update 3, WebApi 2.0 và Identity 2.0 là một phần của out-of-the-box Web Api project template. Trong khi project template mặc định có chút lộn xộn, nó là một điểm bắt đầu tốt để làm quen với những điều cơ bản.

Chúng ta sẽ tạo một project Web Api cơ bản trong visual studio, và sau đó sẽ update các packages Nuget. Trong phần này, nhìn chung chúng ta muốn sử dụng lastest version các package đó, nhưng trong thực thế thì chúng muôn làm việc với lastest release of Web Api (version 2.2 trong bài viết này, được triển khai tháng 7 năm 2014)

Đầu tiên, chọn File => New Project, và chọn ASP.NET Web Application:

Create a new Web Application Project:

New Project_thumb.png

Update the Nuget Packages for the Solotion

Mở Nuget Package Manager và update các Nuget package cho solotion. Chọn Update từ sidebar bên trái, sau đó Update All:

update-nuget-packages_thumb.png

Trong quá trình update, bạn sẽ nhận được một thông báo rằng một vài file trong project của bạn được ghi đề. Các file view .cshtml, và nó nên được ghi đè, như chúng được update cùng với thư viện mới.

Resolve File Conflicts by Clicking “Yes to All”:

nuget-file-conflict-yes-to-all_thumb.png

View files, thế đếu nào? Tôi nghĩ mình đang tạo project Web Api cơ mà?

Đúng vậy, nhưng như tôi đã nói, trong project Web API mặc định nó sẽ có một ít MVC, cho phần Help page, và một basic home page. Và một ít khác nữa.

Run and Test the default Web Api project

Và bây giờ chúng ta đã tạo mới một project Web Api, hãy thử nghiểm nhanh và xem xem mọi thử hoạt động ổn chứ.

Mở một cửa sổ Visual Studio khác, và tạo một ứng dụng console. Tiếp theo, sử dụng Nuget package manager để install Web Api Client Libraries:

Install Web Api Client Libraries into Console Application:

install-webapi-client-libraries-in-console-app_thumb.png

Sau khi cài đặt xong, check update. Tiếp tục, thêm đoạn code sau đây vào file Program.cs (hãy chắc chắn đã add System.Net.Http Newtonsoft.Json đến câu lệnh using trên đầu class):

Example code to run against Web Api Application:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;

namespace TestApi
{
    class Program
    {
        static void Main(string[] args)
        {
            string userName = "john@example.com";
            string password = "Password@123";
            var registerResult = Register(userName, password);

            Console.WriteLine("Registration Status Code: {0}", registerResult);

            string token = GetToken(userName, password);
            Console.WriteLine("");
            Console.WriteLine("Access Token:");
            Console.WriteLine(token);
            Console.Read();
        }

        static string Register(string email, string password)
        {
            var registerModel = new
            {
                Email = email,
                Password = password,
                ConfirmPassword = password
            };
            using (var client = new HttpClient())
            {
                var response =
                    client.PostAsJsonAsync(
                    "http://localhost:62069/api/Account/Register",
                    registerModel).Result;
                return response.StatusCode.ToString();
            }
        }

        static string GetToken(string userName, string password)
        {
            var pairs = new List<KeyValuePair<string, string>>
                        {
                            new KeyValuePair<string, string>( "grant_type", "password" ),
                            new KeyValuePair<string, string>( "username", userName ),
                            new KeyValuePair<string, string> ( "Password", password )
                        };
            var content = new FormUrlEncodedContent(pairs);
            using (var client = new HttpClient())
            {
                var response =
                    client.PostAsync("http://localhost:62069/Token", content).Result;
                return response.Content.ReadAsStringAsync().Result;
            }
        }
    }
}

Và bây giờ, thử chạy ứng dụng Web Api của bạn. Sau khi chạy xong, cửa sổ console mởi sẽ hiện ra.

Những gì chúng ta làm ở đây là POST nội dung một user mới đến method Register() được định nghĩa trong AccountsController trong api của chúng ta. Tiếp theo, chúng ta sẽ gọi đến endpoint Token trong api của chúng ta và lấy access token, cái mà chúng ta sẽ sử dụng để xác thực chính chúng ta trong các lần gọi api tiếp theo.

Nếu bạn không chắc chắn lắm đoạn code trên viết gì, đừng lo lắng. Chúng ta sẽ xem kỹ hơn những gì xãy ra ngay bây giờ. Cứ quan sát đã nếu chúng hoạt động.

Nếu tất cả như mong đợi, output của chúng ta sẽ giống như thế này:

resitration Status Code: OK
Access Token:
{"access_token":"8NeiVoKARt5Rm_50mP2ZfudNvvPRkm-FehohX8cLmUmrm1y8kZj0PTccsH1nKbT
PFTGuKoFSfi2mfD2KD-UMOEQWVJ0PJPfiSebJubSPLElzYfR7vk_V8gcbbkLK6cZ0zS7gWrMhdbgQrrQ
yDPyR83gbkjZcE1ooQQiv9d7AEfjCassj_R76Q44PW7goMHcbFZl66dZLBKGKhf9t7lpcvWStoyS6z8a
m7B3SWppVeaTjAC5BZ6uHOG1d_0mzL8FiR_eV8NaA1w3-GfV-upErG6xk5-qykdoLHoe7zmv4tX5Dm7-
w2n3G0gAdVlPcbfAJgSvu1AmUQe85g5ABbWJ6e0OXoPtH658kYZWC0FxbWiFPLGz66wPMbUCwjk_Hq_p
rLDjOshWP6lIE3qwQ88U5ScB1XcGAXbrYYFZ9AYkwSt4o5cC2Vpw8xP2OFdLdDOUs2ESPtVK8FThhaAh
yFUUDpXSlXwhQ2nEuu27ISw1MK0bh06-xx4vcnfoaW9XuHBXm","token_type":"bearer","expire
s_in":1209599,"userName":"john@example.com",".issued":"Wed, 17 Sep 2014 02:14:29
 GMT",".expires":"Wed, 01 Oct 2014 02:14:29 GMT"}

Tuyệt vời! Bạn đã đăng ký người dùng thành công và lấy được access token từ ứng dụng Web API bạn vừa tạo.

Hãy xem những gì output ở console, đầu tiên, kết quả từ việc đăng ký người dùng. Sau đó quan sát chuỗi Json trả về. Chúng ta deserialized nội dung response trả về sang string, và một chuỗi dài jsson là những gì chúng ta lấy được.

Nếu bạn nhìn kỹ hơn, bạn có thể thấy thuộc tính access_token, và gần đó có một vài thuộc tính khách như token_type, thời gian expired, userName, … Chúng ta sẽ quan sát kỹ tokens hơn một chút.

Và bây giờ mọi thứ đều hoạt động, cùng quan sát xem ứng dụng Web Api được cấu trúc như thế nào, và xác định những phần quan trọng chúng ta cần quan tâm khi làm việc với Web Api và Identity. Sau đó chúng ta sẽ học thêm chút về nghiệp vụ token này.

Chú ý: Đoạn code bên trên hiện đúng nếu ứng dụng của bạn chạy, và như là một ví dụ vệ việc lấy một access token. Trong thực tế, bạn phải luôn luôn sử dụng SSL trước khi gửi/nhận Bearer token trong cách này.

Cấu trúc Web API – Overview

Như đã đề cập trước đó, template project mặc định chứa một vài thứ chúng ta có thể không cần trong một ứng dụng Web Api thực thế. Có một folder tên Areas chứa một loạt các công cụ cho việc quản lý một trang help, một folder Views, ok, một vài file view .cshtml, và một vài folder hầu hết hỗ trợ cho bên MVC trong project của chúng ta, như folder Content, fonts,… Và bây giờ, để an toàn để nói chúng ta sẽ loại bỏ các project folder sau đây (mặc dù chúng cũng có ích sau này, tùy theo mục đích sử dụng của bạn):

  • Areas folder
  • Content folder
  • Fonts folder
  • Scripts folder
  • Views folder

Bên cạnh khác, trong khi chúng ta bắt đầu cùng với Web API và Identity 2.0, các folder DO sau chúng ta cần quan tâm, và một form quan trọng cấu trúc project. Chúng ta cần mở rộng/tuỳ biến tương tự project mặc định:

VS Web Api Project Folders we ARE Interested in:

  • App-Start folder
  • Controllers folder
  • Models folder
  • Providers folder

Folder App_Start
Folder App_Start chứa một vài config khác nhau khi ứng dụng bắt đầu chạy.fj

Advertisements

2 thoughts on “ASP.NET Identity 2.0: Giới thiệu về Identity 2.0 và Web API 2.2

    John Atten said:
    February 7, 2016 at 2:21 am

    So did you just copy this content straight off my blog and repost it? Seriously?

      windluffy responded:
      February 7, 2016 at 2:29 am

      Yes, i just translate it for personal purpose (learning, noting). Sorry about that, i just update credit link. If you want, i can take it as private post. Thanks for feedback.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s