[ASP.Net Identity(一)] 初探 Asp.net Identity 驗證

  • 5926
  • 0
  • MVC
  • 2017-10-13

[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

https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.entityframework.identityuser_properties(v=vs.108).aspx

修改 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