thucnguyenblog logo

Single Sign On (SSO) là gì? SSO với MVC5

thucnguyenit35
09/02/2018 - 11:46:00

Đa số các website có quản lý người dùng đều có phần xác thực tài khoản. Giả sử nếu bạn có nhiều ứng dụng web có cùng dữ liệu người dùng, theo cách đơn giản là người dùng truy cập trang nào thì login vào trang đó; tuy nhiên cách làm này có thể gây khó chịu với một số người dùng khó tính. Chắc hẳn chúng ta đã dùng cách dịch vụ của Google rồi nên chúng ta có thể thấy chỉ cần đăng nhập 1 lần là chúng ta có thể dùng hầu hết các dịch vụ của nó như Gmail, Youtube, Google Plus, … Single Sign On (SSO) giúp chúng ta làm được điều này, SSO đơn giản chỉ là 1 khái niệm đăng nhập 1 lần có thể dùng nhiều dịch vụ.


Sau đây tôi sẽ hướng dẫncác bạn xây dựng hệ thống SSO đơn giản gồm 2 Website. Hướng dẫn được thực hiệnbằng Framework ASP.NET MVC5

1. Tạo Solution và project SSO



2. Thêm AccountController

Viết một hàm login đơn giản sử dụng FormsAuthentication, tài khoản mặc định được cấu hình ở file Web.Config


public class AccountController : Controller
    {
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            if (Request.IsAuthenticated)
            {
                return RedirectToAction("Index", "Home");
            }

            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

        [AllowAnonymous]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(string username, string password, string returnUrl)
        {
            if (FormsAuthentication.Authenticate(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, false);
                if (!string.IsNullOrEmpty(returnUrl))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login details");
                ViewBag.ReturnUrl = returnUrl;
                return View();
            }
        }
    }


3. Thêm Login View


@{
    Layout = null;
    ViewBag.Title = "Login";
}

<h2>Login</h2>
@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl }))
{
    @Html.ValidationSummary()
    @Html.AntiForgeryToken()
    <div class="form-group">
        @Html.Label("Username")
        @Html.Editor("UserName")
    </div>
    <div class="form-group">
        @Html.LabelForModel("Password")
        @Html.Password("Password")
    </div>
    <input class="btn btn-primary" type="submit" value="Login" />
}

4. Thêm machineKey và formsAuthentication

Bạn tự tạo machineKey theo hướng dẫn tại đây. MachineKey là gì thì bạn có thể google tìm hiểu. Nếu lười thì dùng luôn machineKey trong bài hướng dẫn này.

<machineKey
      validationKey="E4451576F51E0562D91A1748DF7AB3027FEF3C2CCAC46D756C833E1AF20C7BAEFFACF97C7081ADA4648918E0B56BF27D1699A6EB2D9B6967A562CAD14767F163"
      decryptionKey="6159C46C9E288028ED26F5A65CED7317A83CB3485DE8C592" validation="HMACSHA256" decryption="AES" />
    <authentication mode="Forms">
      <forms name="SingleSignOn" loginUrl="http://localhost:61162/Account/Login" timeout="480" slidingExpiration="true">
        <credentials passwordFormat="SHA1">
          <user name="demo" password="89e495e7941cf9e40e6980d14a16bf023ccd4c91"/>
          <!--password = demo-->
        </credentials>
      </forms>
    </authentication>


5. Thêm Project WebApp1 và add HomeController

Thêm thuộc tính Authorize cho HomeController, nếu người dùng chưa xác thực, nó sẽ tự động chuyển hướng đến trang đăng nhập


6. Thêm Index View cho HomeController


@{
    Layout = null;
    ViewBag.Title = "Web App1 Home";
}

<h2>Web App1 Home</h2>

Logged in as @User.Identity.Name

7. Thêm machineKey và formsAuthentication cho WebApp1

MachineKey của WebApp1 phải giống của SSO


<machineKey validationKey="E4451576F51E0562D91A1748DF7AB3027FEF3C2CCAC46D756C833E1AF20C7BAEFFACF97C7081ADA4648918E0B56BF27D1699A6EB2D9B6967A562CAD14767F163"
                decryptionKey="6159C46C9E288028ED26F5A65CED7317A83CB3485DE8C592" validation="HMACSHA256" decryption="AES" />
    <authentication mode="Forms">
      <forms name="SingleSignOn" loginUrl="http://localhost:61162/Account/Login" timeout="480" slidingExpiration="true">
      </forms>
    </authentication>

8. Chạy thử

- Start cả 2 website, WebApp1 sẽ tự động chuyển hướng sang SSO yêu cầu đăng nhập

- Đăng nhập sau đó quay lại WebApp1 bạn sẽ thấy user đã được xác thực

Ý tưởng của SSO là như vậy, bạn có thể tải project demo tại đây:  SSO_blog.nguyenthuc.net.zip

 Author infomation:
Xin chào các bạn! Tôi tên là Thức, tôi sinh ra và lớn lên tại quê hương Yên Mỹ, Yên Mô, Ninh Bình, từ thời Trung học tôi đã yêu thích tin học và công nghệ. Tôi tốt nghiệp ngành Công nghệ thông tin tại Đại học Mở Hà Nội, hiện tại tôi đang là một Web Developer. Tôi tạo ra blog này nhằm mục đích chia sẻ kinh nghiệm, kiến thức mà tôi đã trải qua trong cuộc sống, vì thế sẽ có thể thiếu sót mong các bạn đóng góp để giúp tôi hoàn thiện hơn.