ASP.NET 提供了很方便帳號登入登出的驗證功能,今天就來說明一下,如何使用 ASP.NET 表單驗證(FormsAuthentication),來完成登入、登出以及驗證功能。

修改 web.config 啟用表單驗證

首先我們要在 web.config 的 system.web 區段底下新增設定 。 web.config 官方設定說明

  • authentication : 程式啟用 FormsAuthentication,設定登入頁面網址(loginUrl)、timeout 時間(預設30分鐘) 等等….
  • authorization :
    • 在使用表單驗證的情況下 IIS 預設所有人都可以存取任何網頁 ,所以要加入此設定,讓沒登入的使用者自動導向 loginUrl 所設定的網址。
    • 如果沒有設定,則要自行寫 Authorize Filter 驗證使用者使用有權限存取網頁。(微軟預設提供的 Authorize 無法使用)
web config
  • xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<configuration>

<system.web>
<authentication mode="Forms">
<forms loginUrl="Login/Index"
timeout="30"
protection="All"
cookieless="UseDeviceProfile"/>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>

</configuration>

實作登入程式碼

如果對使用者的登入資訊只要使用者姓名,又或者是什麼都保持預設值就好,那其實只要一行程式碼就可以完成登入

Login
  • cs
1
2
3
4
5
6
7
8
[HttpPost]
public ActionResult Login(string userName)
{
// 登入
FormsAuthentication.RedirectFromLoginPage(userName, false);

return RedirectToAction("Index", "Home");
}

如果你想要設定 timeout 時間、存取一些額外資訊等等…,那就要採用 FormsAuthenticationTicket 加密後放入 Cookie。

Login
  • cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[HttpPost]
public ActionResult Login(string userName, string password)
{
// 1. 建立 ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
userName,
DateTime.Now,
DateTime.Now.AddMinutes(30), // value of time out property
false, // Value of IsPersistent property
"Extra Data",
FormsAuthentication.FormsCookiePath);

// 2. 加密 ticket
string encryptedTicket = FormsAuthentication.Encrypt(ticket);

// 3. 建立 HttpCookie
HttpCookie authCookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
encryptedTicket);

// 4. 使用者瀏覽器加入完成驗證的 Cookie
Response.Cookies.Add(authCookie);

return RedirectToAction("Index", "Home");
}

取得登入資訊

登入成功後,登入的相關資訊可以經由 Controller 的 IPrincipal User 取得

IPrincipalIPrincipal

簡單的取得登入使用者姓名以及是否驗證成功的方式

Authenticated
  • cs
1
2
3
4
5
6
7
8
9
public ActionResult Index()
{
// 取得登入者姓名
var info = User.Identity.Name;
// 是否驗證通過
bool isAuthenticated = User.Identity.IsAuthenticated;

return View();
}

將 Identity 轉型為 FormsIdentity,取得整個 FormsAuthenticationTicket

FormsAuthenticationTicket
  • cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public ActionResult GetFormsAuthenticationTicket()        
{
FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;

string cookiePath = ticket.CookiePath;
DateTime expiration = ticket.Expiration;
bool expired = ticket.Expired;
bool isPersistent = ticket.IsPersistent;
DateTime issueDate = ticket.IssueDate;
string name = ticket.Name;
string userData = ticket.UserData;
int verstion = ticket.Version;

return View();
}

實作登出

登出只要簡單一行程式碼就可以了 FormsAuthentication.SignOut();

SignOut
  • cs
1
2
3
4
5
6
public ActionResult SignOut()
{
FormsAuthentication.SignOut();

return RedirectToAction("Index", "Home");
}

參考

[簡介 ASP.NET 表單驗證 (FormsAuthentication) 的運作方式]
[Explained: Forms Authentication in ASP.NET 2.0]
[FormsAuthenticationTicket.UserData 屬性]
[自訂 Authorize Filter]