Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

透過 IIS 的 Form Authentication 來進行 SSO

Introduction

雖然現在 .Net 的登入機制已經較少 Form Authentication,但是剛好看到這範例,分享一下。

Conetent

透過使用相同的 Form Authentication 來使兩個網站的登入機制使用共同的資料。
沒有單一簽入(SSO)的流程


graph LR
A(fa:fa-user-md User)
A-->B2[fa:fa-sign-in 登入A網站]
A-->B3[fa:fa-sign-in 登入B網站]
B2-->C1[fa:fa-sign-in 網站A]
B3-->C2[fa:fa-sign-in 網站B]

對比
使用單一簽入(SSO)的流程


graph LR
A(fa:fa-user-md User)
A-->B[fa:fa-sign-in SSO登入]
B-->C1[fa:fa-sign-in 網站A]
B-->C2[fa:fa-sign-in 網站B]

這可以明顯看出,登入方式變成一個 SSO 登入了,當然此處是指會員資料的取得,實際看頁面流程的話,就不是這樣的單純。
以下簡單列出 arunendapally SSO 範例的樹狀結構,可以看出範例列了三個網站

  • SSO 單一簽入的網站
  • 模擬網站 A
  • 模擬網站 B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
├─SSO
│ ├─App_Data
│ ├─App_Start
│ ├─Controllers
│ ├─Models
│ └─Views
│ └─Account
├─WebApp1
│ ├─App_Data
│ ├─App_Start
│ ├─Controllers
│ ├─Models
│ └─Views
│ └─Home
└─WebApp2
├─App_Data
├─App_Start
├─Controllers
├─Models
└─Views
└─Home

登入檢查 FormsAuthentication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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();
}
}

以上都是程式方面的操作,比較值得注意的是,這範例是透過 IIS 的 machine key 來進行設定這三個網站是使用同一份登入資訊

1
2
3
4
<machineKey validationKey="E4451576F51E0562D91A1748DF7AB3027FEF3C2CCAC46D
756C833E1AF20C7BAEFFACF97C7081ADA4648918E0B56BF27D1699A6EB2D9B6967A562CAD14767F163"
decryptionKey="6159C46C9E288028ED26F5A65CED7317A83CB3485DE8C592"
validation="HMACSHA256" decryption="AES" />

詳細的操作內容可以參考 arunendapally blog 文章,此處補充 IIS 的設定,首先在開啟 IIS ,選取 SSO 網站的電腦金鑰,並記錄下其驗證金鑰解密金鑰,接著在網站 A 與網站 B,都點擊電腦金鑰
電腦金鑰
然後將 SSO 網站的驗證金鑰解密金鑰設定到網站 A 與網站 B
電腦金鑰設定

這樣這範例就可以操作囉。

Reference

此文的範例是參考 arunendapally,範例可以在 Github 取得

歡迎關注我的其它發布渠道