[ASP.Net Identity1] 初探 Asp.net Identity 驗證
我們先來做一個假設,假設你要整合你的iOS與Android的裝置,你提供了WebApi讓行動裝置可以透過這個Api來對資料庫做操作,這會關係到資料庫的增刪改查。先撇開其他的安全機制不談,首先最基本的,這些放在網路上的WebApi可能你只會提供給通過驗證的使用者來使用,那這部分要如何處理? 這一系列就來研究Asp.Net Identity 與iOS還有Android的整合。
在開始進入iOS,Android 與Asp.net Identity如何整合之前,先以系列的文章來了解一下Asp.Net Identity的驗證。
建立一個空的MVC專案
建立一個HomeController
在空的MVC專案中建立一個HomeController,在HomeController下建立兩個Action。並且指定[Authorize]屬性標籤給這兩個Action。
[Authorize(Roles = "Users")]
publicActionResult Index()
{
var name = User.Identity.Name;
Response.Write(name);
return View();
}
[Authorize(Roles = "Managers")]
publicActionResult Manager() {
return View();
}
執行這一個MVC網頁
執行這個專案後發生401.1錯誤,因為沒有登入,所以目前沒有權限瀏覽網站。
最基本的登入實現
在Global.asax中加入Application_AuthenticateRequest方法,讓MVC嘗試對用戶進行登入的時候會進到這個方法裡面。在這裡我們用手動的方式幫用戶建立ClaimsIdentity和ClaimsPrincipal Instance,然後把Principal指给HttpContext.Current.User。
Protected void Application_AuthenticateRequest()
{
var claims = new List<claim>();
claims.Add(new Claim(ClaimTypes.Name, "Ben Lu"));
claims.Add(new Claim(ClaimTypes.Role, "Users"));
var identity = new ClaimsIdentity(claims, "MyClaimsLogin");
ClaimsPrincipal principal = new ClaimsPrincipal(identity);
HttpContext.Current.User = principal;
}
新增完上面這段程式碼,就可以實現登入了。這邊再來看看ClaimIdentity與ClaimPrincipal。
在宣告式驗證的架構下,主要就是兩個類別ClaimsIdentity與ClaimsPrincipal這兩個類別。兩者分別繼承於 Identity與IPrincipal。
先看到Identity介面,這個介面只包含了三個很基本的用戶屬性:
在範例中,我們並沒有設定ClaimsIdentity的IsAuthenticated的屬性為True。在.Net4.5以前,如果去設定了Identity的Name屬性時,IsAuthenticated屬性就會被設定為True。.Net4.5以後,預設ClaimsIdentity的IsAuthenticater屬性是false。只有在程式中指定Authentication Type,才會被設定為True。
再來看到IPrincipal這個物件,
IPrincipal原則物件表示程式碼正在為其執行的使用者安全性內容,包含該使用者的識別 (IIdentity) 和他們所屬的角色。
總結:在最基本的登入中,我們做以下的流程。
1. 建立一個ClaimIdentity
2. 建立一個ClaimPricipal,並且把ClaimIdentity指向給它。
3. 將ClaimPricipal指給HttpContext.Current.user。
參考資料
IdentityUser Properties
修改 ASP.NET Identity 預設的 Table Name
http://www.dotblogs.com.tw/ageoldmemories/archive/2013/12/23/135807.aspx
Per request lifetime management for UserManager class in ASP.NET Identity
http://blogs.msdn.com/b/webdev/archive/2014/02/18/10499038.aspx
ASP.NET Identity登录原理
http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-based-authentication-and-owin.html
HttpHandler与HttpModule的理解与应用
http://www.cnblogs.com/knowledgesea/archive/2013/03/20/2935933.html
OWIN 请求处理与中间件
http://beginor.github.io/2014/09/03/owin-middle-ware.html