登入驗證普遍為寫網站會用到的,但老是忘記所以實作一次記錄下來。
本次將從空的MVC專案開始建立起。
【開發環境】
開發工具:Visual Studio Professional 2015
.Net Framework:4.6.1
套件:Microsoft.Owin.Host.SystemWeb、Microsoft.Owin.Security.Cookies
【步驟開始】
Step 1.
建立空的專案,但加入資料夾和核心參考的部分勾選『MVC』。
建立完成內部會像是下圖,乾乾淨淨。
Step 2.
安裝Microsoft.Owin.Host.SystemWeb、Microsoft.Owin.Security.Cookies兩個套件。
Step 3.
建立Startup的Class。建立完成後在裡面寫上以下程式碼。
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
//識別的Cookie名稱
AuthenticationType = "AuthorizeDemoCookie",
//無權限時導頁
LoginPath = new PathString("/Home/index")
});
}
*補充*筆者很任性,一開始故意不建立這個Class,下場就是....
Step 4.
建立驗證資料的Action
[HttpPost]
public ActionResult Login(string account,string password)
{
LoginService service = new LoginService();
//驗證登入資訊是否有對應之使用者
var userInfo = service.GetUser(account, password);
if (userInfo == null)
{
//如無對應使用者導頁
return RedirectToAction("Signup");
}
//儲存使用者資訊
ClaimsIdentity identity = new ClaimsIdentity(new[] {
new Claim(ClaimTypes.Name, userInfo.Name),
new Claim("Id", userInfo.Id),
new Claim(ClaimTypes.Role, userInfo.Group)
},
"AuthorizeDemoCookie");
Request.GetOwinContext().Authentication.SignIn(identity);
//通過驗證者導頁
return RedirectToAction("IndexPro");
}
這一步驟主要做三件事 驗證=>儲存資訊=>導頁。
Step 5.
在Action上設定適合的Attribute。
[AllowAnonymous] //不須授權
public ActionResult Signup()
{
return View();
}
[Authorize] //有授權即可進入
public ActionResult MemberIndex()
{
return View();
}
[Authorize(Roles = "Payer")] //有授權且為指定角色才可進入
public ActionResult IndexPro()
{
return View();
}
【補充】
1. 在Action取得儲存資料方法
public ActionResult SampleAction()
{
//是否已認證
bool isAuthenticated = User.Identity.IsAuthenticated;
//取得識別的Cookie名稱
string cookieName = User.Identity.AuthenticationType;
//取得設定的Name (Step 4的 ClaimTypes.Name)
string name = User.Identity.Name;
//取得此驗證所有儲存資料
ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;
//取得Step 4設定的Id
string id = identity.Claims.FirstOrDefault(f => f.Type == "Id")?.Value;
return View();
}
【參考資料】
https://dotblogs.com.tw/jgame2012/2016/07/27/010210
https://aspnetmars.blogspot.tw/2017/05/aspnet-mvc-owin-identity.html
https://stackoverflow.com/questions/21404935/mvc-5-access-claims-identity-user-data
【後記】
還有可以自訂驗證,有機會再來紀錄。