[ASP.NET] MVC 登入驗證(Owin 實作)

登入驗證普遍為寫網站會用到的,但老是忘記所以實作一次記錄下來。

本次將從空的MVC專案開始建立起。

【開發環境】
開發工具:Visual Studio Professional 2015
.Net Framework:4.6.1
套件:Microsoft.Owin.Host.SystemWebMicrosoft.Owin.Security.Cookies

【步驟開始】
Step 1.
建立空的專案,但加入資料夾和核心參考的部分勾選『MVC』。

建立完成內部會像是下圖,乾乾淨淨。

Step 2.
安裝Microsoft.Owin.Host.SystemWebMicrosoft.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

【後記】
還有可以自訂驗證,有機會再來紀錄。